【笔记】编写cmakelist的常用命令含义及使用

文章目录

    • 命令
      • project
      • file
      • set
      • configure_file
      • list
      • add_library
      • set_target_properties
      • target_link_directories
      • target_link_libraries
      • target_compile_definitions
      • add_subdirectory
      • function

持续更新

命令

project

  • 用于定义一个项目,它是 CMakeLists.txt 文件中的第一个命令,通常也是必须的命令。project 命令的主要作用是设置项目的名称,并且可以指定项目的版本和语言。

  • ex

    project(MyProject VERSION 1.0.0 LANGUAGES CXX)
    
  • 后续使用项目名MyProject时可以直接使用宏${PROJECT_NAME}替换

file

  • 用于执行各种文件和目录相关的操作。它可以用来读写文件、创建目录、删除文件、获取文件属性等
    1. file(READ):读取文件内容到一个变量中。
    2. file(WRITE):将内容写入到一个文件中。
    3. file(APPEND):将内容追加到一个文件的末尾。
    4. file(GLOB):搜索匹配特定模式的文件,并将结果存储在一个变量中。
    5. file(MAKE_DIRECTORY):创建一个目录。
    6. file(REMOVE):删除文件。
    7. file(COPY):复制文件或目录。
    8. file(REAL_PATH):获取文件的绝对路径

set

  • 用于设置一个变量的值。这个变量可以是普通的变量、缓存变量或者环境变量

configure_file

  • 通常用于生成配置头文件、资源文件或者是一些根据构建系统变量动态生成的文件。
  • 例如,如果你有一个名为 config.h.in 的模板文件,其中包含了如下内容:
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
project(MyProject VERSION 1.0)
configure_file(config.h.in config.h)

在生成 config.h 文件时,@PROJECT_VERSION_MAJOR@ 和 @PROJECT_VERSION_MINOR@ 会被替换为项目的版本号中的主要和次要版本号。

list

  • 用于操作列表类型的变量
    1. LENGTH:获取列表的长度。
    2. APPEND:向列表末尾添加一个或多个元素。
    3. FIND:在列表中查找一个元素的索引。

add_library

  • 用于定义一个库目标,这个库目标可以是静态库、共享库或者是一个对象库。定义库目标后,CMake 会生成相应的构建规则,以便在构建过程中编译库的源代码。
  • 在定义库目标之后,你可以使用 target_link_libraries 命令来指定库应该链接的其他库,使用 target_include_directories 来指定库的包含目录,以及其他用于配置目标属性的命令。
add_library(<name> [STATIC | SHARED | MODULE]
             [EXCLUDE_FROM_ALL]
             [source1] [source2] [...])
  • name:指定库目标的名称。这个名称用于在 CMake 项目中引用库目标。
  • [STATIC | SHARED | MODULE]:指定库的类型。STATIC 表示静态库,SHARED 表示共享库(动态链接库),MODULE 表示不会被直接链接的模块,通常用于插件。如果省略这个参数,CMake 会根据变量 BUILD_SHARED_LIBS 的值决定是生成静态库还是共享库
  • [EXCLUDE_FROM_ALL]:如果指定了这个选项,那么这个库目标不会默认被构建,除非明确指定要构建它。
  • [source1] [source2] […]:指定库的源代码文件。这些文件将会被编译并包含在库中。

set_target_properties

  • 用于设置一个目标的属性,这些属性可以控制目标的构建行为,比如编译选项、链接选项、包含目录、输出目录等

  • ex

        set_target_properties(MyExecutable PROPERTIES
            OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
            COMPILE_FLAGS "-Wall -Wextra")
    
  • 在这个例子中,OUTPUT_DIRECTORY 属性被设置为构建目录下的 bin 子目录,而 COMPILE_FLAGS 属性被用来添加额外的编译器警告标志。

target_link_directories

  • 用于指定目标链接时搜索库文件的目录的命令。这个命令告诉 CMake 当编译一个目标(比如可执行文件或库)时,到哪里查找需要的库文件。
target_link_directories(<target> [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  ...
)
  • :指定要添加链接目录的目标,这个目标必须是之前通过 add_executable()add_library() 创建的。
  • [BEFORE]:可选参数,如果指定,这些目录将在目标自己的链接目录之前被搜索。
  • <INTERFACE|PUBLIC|PRIVATE>:指定链接目录的作用域。
    • INTERFACE:目录只会影响那些链接到目标的其他目标。
    • PUBLIC:目录会影响目标本身和链接到目标的其他目标。
    • PRIVATE:目录只会影响目标本身
  • [items1…]:要添加的目录列表。

target_link_libraries

  • 用于指定目标(如可执行文件或库)链接时需要的库。这个命令告诉 CMake 在构建一个目标时,需要链接哪些库,以及这些库的链接顺序。

  • 在链接库时,库的顺序很重要,特别是当链接器依赖于库的依赖关系顺序时。CMake 会按照你指定的顺序将库传递给链接器。

  • ex

    target_link_libraries(MyExecutable Qt5::Gui Qt5::Widget)
    

target_compile_definitions

  • 用于为特定的目标(如可执行文件或库)添加或取消编译定义。编译定义通常用于条件编译,它们可以在源代码中通过预处理器指令(如 #ifdef)来检测。

add_subdirectory

  • 用于将一个子目录添加到构建树中。这个命令会使得 CMake 处理子目录中的 CMakeLists.txt 文件,并添加其中的构建目标到当前项目的构建系统中

function

  • 用于定义一个自定义函数,这样你就可以在 CMake 脚本中重复使用一段代码
  • ex 如果你想定义一个函数来计算两个数的和,并返回结果
function(calculate_sum a b output)
  math(EXPR sum "${a} +${b}")
  set(${output}${sum} PARENT_SCOPE)
endfunction()

# 调用自定义函数并获取返回值
calculate_sum(5 3 result)
message(STATUS "The sum is: ${result}")

在这个例子中,calculate_sum 函数接受两个输入参数 a 和 b,以及一个输出参数 output。函数内部使用 math(EXPR) 命令计算两数之和,并使用 set 命令将结果存储在 output 参数中。PARENT_SCOPE 选项确保输出参数的值在函数外部可见。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊聊路径规划算法(四)——滚动在线RRT算法和BUG算法

基本RRT算法更偏向于遍历所有自由空间直到获取可行路由性&#xff0c;这使得它不能够进行未知或动态环境条件中的机器人实时运动计划。利用滚动计划的思路可以将RRT算法加以完善&#xff0c;使之更具有实时规划能力。 滚动规划 机器人在不确定的或动态周围环境中行走时&#x…

C++-结构体-指针-地址-指针的指针-地址的地址

经验证&#xff0c;仿真结果与预期一致。 #include <QDebug> struct test_years {int year;};//定义结构体 int main() {//定义三个结构体&#xff0c;s01,s02,s03test_years s01,s02,s03;s01.year 1000;//给s01结构体中year赋值s02.year 2000;//给s02结构体中year赋值…

yml文件解析

.yml 后缀的文件可以有多个application.yml # 项目相关配置 用于 RuoYiConfig.java ruoyi:# 名称name: RuoYi# 版本version: 3.8.5# 版权年份copyrightYear: 2023# 实例演示开关demoEnabled: true# 文件路径 示例&#xff08; Windows配置D:/ruoyi/uploadPath&#xff0c;Lin…

算法复杂度分析笔记

基本定义间的关系 算法介绍 算法分析 时间复杂度 用数量级刻画&#xff1a;忽略所有低次幂项和系数 eg1: eg2: eg3: eg4: 小结 空间复杂度 eg: 总结

【目标检测】基于深度学习的SAR图像船舶目标检测(yolov5算法,附代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内) 路虽远,行则将至;事虽难,做…

【python】计算水仙花数

【python】计算水仙花数 "水仙花数"是指一个3位数&#xff0c;它的三个位上的数字的3次幂之和等于它本身。例如&#xff0c;"153"就是一个水仙花数&#xff0c;因为1^3 5^3 3^3 153。以下是一个Python代码示例&#xff0c;用于计算并打印出所有的三位数…

程序员副业指导

程序员如何搞副业&#xff1f; 程序员不仅拥有将抽象概念转化为实际应用的能力&#xff0c;还通常具备强大的逻辑思维和问题解决能力。然而&#xff0c;许多程序员并不满足于仅仅在一家公司工作&#xff0c;他们渴望通过副业来实现个人价值的最大化&#xff0c;增加收入&#…

MySQL数据库-优化慢查询

1、什么是慢查询&#xff1f; 慢查询就是SQL执行时间过长&#xff0c;严重影响用户体验的SQL查询语句。当它频繁出现时数据库的性能和稳定性都会受到威胁 慢查询是数据库性能瓶颈的常见原因&#xff0c;是指SQL执行时间超过阈值&#xff1b;可能由于复杂的连接、缺少索引、不恰…

噪声系数测试之增益法

提到增益法测试噪声系数,大家并不陌生,这是一种简洁的测试方法,精度不如Y因子法,但是在某些测试场合,比如只有频谱仪而没有噪声头时,且待测件具有非常高的增益时,就可以使用增益法测试噪声系数。 增益法测试噪声系数的连接示意图如图1所示,其思路为:DUT输入端端接50 …

响应式修改 页面字体字号【大 中 小 】

浅浅记录下&#xff0c;工作中遇到的问题&#xff0c;修改页面文本字号。 <p class"change_fontSize">[ 字号 <a href"javascript:doZoom(18)">大</a><a href"javascript:doZoom(16)">中</a><a href"ja…

中标麒麟系统VSCode 终端字体间距变大的解决办法

设置 一、打开设置-用户-功能-终端 二、搜索 Integrated: Font Family, 如下图 至于字体的设置&#xff0c;不同系统设置并不一样 在CentOS7内核的中标麒麟系统&#xff0c;需要设置字体为“Courier New”&#xff0c;显示比较正常 参考链接 Vscode——终端字体突然间距变大…

flutter书架形式格口的动态创建(行、列数,是否全选的配置)

根据传入的行列数创建不同格口数量的书架 左图&#xff1a;5行3列、右图&#xff1a;3行3列 代码 import package:jade/bean/experienceStation/ExpCellSpecsBean.dart; import package:jade/configs/PathConfig.dart; import package:jade/utils/DialogUtils.dart; import p…

深入挖掘C语言 ----动态内存分配

开篇备忘录: "自给自足的光, 永远都不会暗" 目录 1. malloc和free1.1 malloc1.2 free 2. calloc和realloc2.1 calloc2.2 realloc 3. 总结C/C中程序内存区域划分 正文开始 1. malloc和free 1.1 malloc C语言提供了一个动态开辟内存的函数; void* malloc (size_t s…

【Flutter】自动生成图片资源索引插件一:FlutterAssetRefGenerator

介绍 FlutterAssetRefGenerator 插件&#xff1a;windows上 点击生成图片索引按钮后&#xff0c;pubspec.yaml 会出现中文乱码&#xff0c;需要手动改乱码&#xff1b;mac上没问题。 优点&#xff1a;点击图标自动生成。 目录 介绍一、安装二、使用 一、安装 安装FlutterAsset…

VirtualBox Manjaro Linux(kde)虚拟机扩容 增大硬盘存储空间

https://blog.csdn.net/m0_65274357/article/details/131965463 df -h发现/可用空间之后几百M了 文件系统 大小 已用 可用 已用% 挂载点 dev 2.0G 0 2.0G 0% /dev run 2.0G 1.2M 2.0G 1% /run /dev/sda1 40G 37…

车载终端叉车_车载人脸识别ADAS行为识别解决方案

智能车载终端的广泛应用为叉车行业注入了新的活力&#xff0c;提升了驾驶安全和效能。通过采用多种验证技术&#xff0c;如指纹、人脸、扫码和刷卡等&#xff0c;智能车载终端实现了对司机操作权限的验证&#xff0c;在叉车启动时能够自动检测安全带的状态。如果驾驶员未系安全…

OSPF综合大实验

1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&#xff0c;其他路由器均有一个环…

短信登录session-redis

1.流程 1.1 发送验证码 模拟路径 http://127.0.0.1:8080/api/user/code?phone1335566 Request Method:POSTcontroller层 /*** 发送手机验证码*/PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {…

电机控制专题(二)——Sensorless之扩展反电动势EEMF

文章目录 电机控制专题(二)——Sensorless之扩展反电动势EEMF前言理论推导仿真验证总结参考文献 电机控制专题(二)——Sensorless之扩展反电动势EEMF 前言 总结下电机控制中的扩展反电动势模型。 纯小白&#xff0c;如有不当&#xff0c;轻喷&#xff0c;还请指出。 在得出E…

SD-WAN解决电商企业海外业务网络难题

全球化背景下&#xff0c;众多国内企业都涉及到海外贸易业务&#xff0c;尤其是出海电商得到蓬勃发展。企业做出海电商&#xff0c;需要访问国外网页、社交平台&#xff0c;如亚马逊、TikTok、Facebook、YouTube等与客户沟通互动&#xff0c;SD-WAN的发展正好为解决国际网络访问…