【配置后的基本使用】CMake基础知识

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀各种软件安装与配置_十二月的猫的博客-CSDN博客

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 

目录

1. 前言

2. CMake 基础

2.1 CMakeLists.txt 文件

文件结构和基本语法

实例

2.2 变量和缓存

变量定义与使用

缓存变量

2.3 查找库和包

find_package() 指令

使用第三方库

3. 总结


1. 前言

通过上一篇文章:【一篇搞定配置】Window上的CMake的安装配置-CSDN博客

我们已经完成了在Window、Linux、maxos操作系统上的CMake环境配置。

但是很多小伙伴还是不会使用CMake,同时考虑到像linux虚拟机、linux指令等很多友友虽然跟着猫猫完成了配置,但是还是不会使用。

于是,猫猫决定在专栏:各种软件安装与配置_十二月的猫的博客-CSDN博客中开设一个新的部分【配置后的基本使用】用来帮助友友进一步的学习。

2. CMake 基础

2.1 CMakeLists.txt 文件

CMakeLists.txt 是 CMake 的配置文件,用于定义项目的构建规则、依赖关系、编译选项等。

这也是CMake最核心的部分

每个 CMake 项目通常都有一个或多个 CMakeLists.txt 文件。

文件结构和基本语法

CMakeLists.txt 文件使用一系列的 CMake 指令来确定项目构建过程(构建规则、依赖关系、编译选项等)。常见的指令包括:

1、指定 CMake 的最低版本要求:

cmake_minimum_required(VERSION <version>)

例如:

cmake_minimum_required(VERSION 3.10)

2、定义项目的名称和使用的编程语言:

project(<project_name> [<language>...])

例如:

project(MyProject CXX)

3、指定要生成的可执行文件和其源文件(头文件和cpp文件):

add_executable(<target> <source_files>...)

例如:

add_executable(MyExecutable main.cpp other_file.cpp)

4、创建一个库(静态库或动态库)及其源文件:

add_library(<target> <source_files>...)

例如:

add_library(MyLibrary STATIC library.cpp)

 知识补充:

        1、静态库:静态库链接的时候把库直接加载到程序中,运行效率高但耦合度也高

        2、动态库:只是保留接口,将动态库与程序代码独立,运行效率低但耦合度也低

        3、库:各种代码的整合。代码文件链接库后可以直接使用库中的函数

5、链接目标文件与其他库:

target_link_libraries(<target> <libraries>...)

例如:

target_link_libraries(MyExecutable MyLibrary)

将目标文件和库整合在一起,从而让目标文件可以使用库中的代码

 6、添加头文件搜索路径:

include_directories(<dirs>...)

例如:

include_directories(${PROJECT_SOURCE_DIR}/include)

7、设置变量的值:

set(<variable> <value>...)

例如:

set(CMAKE_CXX_STANDARD 11)

8、设置目标属性:

target_include_directories(TARGET target_name[BEFORE | AFTER][SYSTEM] [PUBLIC | PRIVATE | INTERFACE][items1...])

例如:

target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)

9、安装规则:

install(TARGETS target1 [target2 ...][RUNTIME DESTINATION dir][LIBRARY DESTINATION dir][ARCHIVE DESTINATION dir][INCLUDES DESTINATION [dir ...]][PRIVATE_HEADER DESTINATION dir][PUBLIC_HEADER DESTINATION dir])

例如:

install(TARGETS MyExecutable RUNTIME DESTINATION bin)

10、条件语句 (if, elseif, else, endif 命令)

if(expression)# Commands
elseif(expression)# Commands
else()# Commands
endif()

例如:

if(CMAKE_BUILD_TYPE STREQUAL "Debug")message("Debug build")
endif()

11、自定义命令 (add_custom_command 命令):

add_custom_command(TARGET targetPRE_BUILD | PRE_LINK | POST_BUILDCOMMAND command1 [ARGS] [WORKING_DIRECTORY dir][COMMAND command2 [ARGS]][DEPENDS [depend1 [depend2 ...]]][COMMENT comment][VERBATIM]
)

例如:

add_custom_command(TARGET MyExecutable POST_BUILDCOMMAND ${CMAKE_COMMAND} -E echo "Build completed."
)

实例

一个简单的 CMakeLists.txt 文件示例:

cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)# 添加源文件
add_executable(MyExecutable main.cpp)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)

掌握这四个用法,基本简单的CMake文件也是建立起来了

2.2 变量和缓存

CMake 使用变量来存储和传递信息,这些变量可以在 CMakeLists.txt 文件中定义和使用。

变量可以分为普通变量和缓存变量。

变量定义与使用

定义变量:

set(MY_VAR "Hello World")

使用变量:

message(STATUS "Variable MY_VAR is ${MY_VAR}")

缓存变量

缓存变量存储在 CMake 的缓存文件中,用户可以在 CMake 配置时修改这些值。缓存变量通常用于用户输入的设置,例如编译选项和路径。

定义缓存变量:

set(MY_CACHE_VAR "DefaultValue" CACHE STRING "A cache variable")

使用缓存变量:

message(STATUS "Cache variable MY_CACHE_VAR is ${MY_CACHE_VAR}")

2.3 查找库和包

CMake 可以通过 find_package() 指令自动检测和配置外部库和包。

常用于查找系统安装的库或第三方库。

find_package() 指令

基本用法:

find_package(Boost REQUIRED)

指定版本:

find_package(Boost 1.70 REQUIRED)

查找库并指定路径:

find_package(OpenCV REQUIRED PATHS /path/to/opencv)

使用查找到的库:

target_link_libraries(MyExecutable Boost::Boost)

设置包含目录和链接目录:

include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

使用第三方库

假设你想在项目中使用 Boost 库,CMakeLists.txt 文件可能如下所示:

实例

cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)# 查找 Boost 库
find_package(Boost REQUIRED)# 添加源文件
add_executable(MyExecutable main.cpp)# 链接 Boost 库
target_link_libraries(MyExecutable Boost::Boost)

3. 总结

通过上述内容,用户可以了解 CMakeLists.txt 文件的基本结构和常用指令,掌握如何定义和使用变量,查找和配置外部库,从而能够有效地使用 CMake 管理项目构建过程。

如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~    

你的点赞就是猫猫更新的动力

本文转载自:CMake 基础 | 菜鸟教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/473684.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos 7 安装wget

Centos 7 安装wget 最小化安装Centos 7 的话需要上传wget rpm包之后再路径下安装一下。rpm包下载地址&#xff08;http://mirrors.163.com/centos/7/os/x86_64/Packages/&#xff09; 1、使用X-ftp 或者WinSCP等可以连接上传的软件都可以首先连接服务器&#xff0c;这里我用的…

Linux最深刻理解页表于物理内存

目录 物理内存管理 页表设计 物理内存管理 如果磁盘上的内容加载到物理内存上&#xff0c;每次io都会按照4kb的方式进行加载(可能不同版本系统有些区别)。所以我们的物理内存上的内容也是4个字节进行管理的。 而每个页框都需要我们进行管理。所以自然物理内存就会对页框进行先…

几何合理的分片段感知的3D分子生成 FragGen - 评测

FragGen 来源于 2024 年 3 月 25 日 预印本的文章&#xff0c;文章题目是 Deep Geometry Handling and Fragment-wise Molecular 3D Graph Generation&#xff0c; 作者是 Odin Zhang&#xff0c;侯廷军&#xff0c;浙江大学药学院。FragGen 是一个基于分子片段的 3D 分子生成模…

PySpark——Python与大数据

一、Spark 与 PySpark Apache Spark 是用于大规模数据&#xff08; large-scala data &#xff09;处理的统一&#xff08; unified &#xff09;分析引擎。简单来说&#xff0c; Spark 是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算 TB 、…

基于Java Springboot编程语言在线学习平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

WebRTC视频 02 - 视频采集类 VideoCaptureModule

WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule&#xff08;本文&#xff09; WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇 WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇 WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前言…

深度学习笔记14-卷积神经网络2

1.卷积神经网络的结构 卷积神经网络&#xff0c;是包含卷积运算且具有深度结构的前馈神经网络。在卷积神经网络中&#xff0c;包含卷积层、池化层和全连接层三种重要的结构。相比前馈神经网络&#xff0c;卷积层和池化层是新增的网络结构&#xff0c;在提取特征时&#xff0c;卷…

Python 正则表达式使用指南

Python 正则表达式使用指南 正则表达式&#xff08;Regular Expression, 简称 regex&#xff09;是处理字符串和文本的强大工具。它使用特定的语法定义一组规则&#xff0c;通过这些规则可以对文本进行匹配、查找、替换等操作。Python 提供了 re 模块&#xff0c;使得正则表达…

FPGA开发-逻辑分析仪的应用-数字频率计的设计

目录 逻辑分析仪的应用 数字频率计的设计 -基于原理图方法 主控电路设计 分频器设计 顶层电路设计 数字系统开发不但需要进行仿真分析&#xff0c;更重要的是需要进行实际测试。 逻辑分析仪的应用 测试方式&#xff1a;&#xff08;1&#xff09;传统的测试方式&#…

.NET 9.0 中 System.Text.Json 的全面使用指南

以下是一些 System.Text.Json 在 .NET 9.0 中的使用方式&#xff0c;包括序列化、反序列化、配置选项等&#xff0c;并附上输出结果。 基本序列化和反序列化 using System; using System.Text.Json; public class Program {public class Person{public string Name { get; se…

Linux 命令 | 每日一学,文本处理三剑客之awk命令实践

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 前言简述 描述&#xff1a;前面作者已经介绍了文本处理三剑客中的 grep 与 sed 文本处理工具&#xff0c;今天将介绍其最后一个且非常强大的 awk 文本处理输出工具&#xff0c;它可以非常方便…

【第五课】Rust所有权系统(一)

目录 前言 所有权机制的核心 再谈变量绑定 主人变更-所有权转移 总结 前言 这节课我们来介绍下rust中最重要的一个点&#xff1a;所有权系统。这是网上经常说rust无gc的秘密所在。在开始之前&#xff0c;我们来想想JVM系语言&#xff0c;在做垃圾回收的过程&#xff0c;1.…

三周精通FastAPI:42 手动运行服务器 - Uvicorn Gunicorn with Uvicorn

官方文档&#xff1a;Server Workers - Gunicorn with Uvicorn - FastAPI 使用 fastapi 运行命令 可以直接使用fastapi run命令来启动FastAPI应用&#xff1a; fastapi run main.py如创建openapi.py文件&#xff1a; from fastapi import FastAPIapp FastAPI(openapi_url&…

任意文件下载漏洞

1.漏洞简介 任意文件下载漏洞是指攻击者能够通过操控请求参数&#xff0c;下载服务器上未经授权的文件。 攻击者可以利用该漏洞访问敏感文件&#xff0c;如配置文件、日志文件等&#xff0c;甚至可以下载包含恶意代码的文件。 这里再导入一个基础&#xff1a; 你要在网站下…

编写一个生成凯撒密码的程序

plain list(input("请输入需要加密的明文&#xff08;只支持英文字母&#xff09;&#xff1a;"))key int(input("请输入移动的位数&#xff1a;"))base_A ord(A)base_a ord(a)cipher []for each in plain:if each :cipher.append( )else:if each.i…

RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)

RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整&#xff0c;全面重新设计业务逻辑代码&#xff0c;代码量减少一半以上&#xff0c;开发更加高效。全系统引入全新字体图标&#xff0c;整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar&#xff0c;让开发更加…

华为USG5500防火墙配置NAT

实验要求&#xff1a; 1.按照拓扑图部署网络环境&#xff0c;使用USG5500防火墙&#xff0c;将防火墙接口加入相应的区域&#xff0c;添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip&#xff0c;使trust区域…

Java基础-I/O流

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 字节流 定义 说明 InputStream与OutputStream示意图 说明 InputStream的常用方法 说明 OutputStrea…

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)

上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.&#xff08;只演⽰部分常⽤的⼯作模式&#xff09; 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …

<项目代码>YOLOv8 番茄识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…