CMake简单笔记

文章目录

  • cmake预设变量
    • 预定义变量表格
    • 预设变量详解
    • 其他预定义变量:
    • 设置CMAKE预定义变量 `set()`
      • 设置 项目构建
      • 设置编译选项 编译链 编译器
    • 设置 项目输出
  • 添加编译选项
    • `add_compile_options`
    • `add_definitions(-DDEBUG -DMYDEFINE)` 添加宏定义
  • 搜寻&添加 `源文件 .c .cpp .s`
    • `aux_source_directory`
    • `file(GLOB )`
  • 搜索&添加 `头文件 .h .hpp`
    • `target_include_directories`
    • `target_link_directories`
    • `include_directories`
    • `link_directories`
    • ==需要注意的是==
  • 创建构建目标
    • `add_library` 静态/动态/组件库
    • `add_executable` 可执行文件
    • `add_subdirectory` :纳入子CMake构建配置
    • `target_link_libraries`
  • 设置目标属性
    • `set_target_properties`设置的属性
    • `set_property`
    • ==`PROPERTIES`==
  • 导入静态/动态库文件

cmake预设变量

预定义变量表格

CMake 变量名描述
CMAKE_SOURCE_DIR当前 CMakeLists.txt 所在的源码目录的根路径
CMAKE_BINARY_DIR构建目录的根路径,用于存放构建生成的可执行文件、库和其他输出
CMAKE_CURRENT_SOURCE_DIR当前处理的 CMakeLists.txt 所在的源码目录路径
CMAKE_CURRENT_BINARY_DIR当前处理的 CMakeLists.txt 所在的构建目录路径
CMAKE_CURRENT_LIST_DIR当前处理的 CMakeLists.txt 文件的实际目录路径(源码或构建)
CMAKE_CURRENT_LIST_LINE当前正在处理的 CMakeLists.txt 文件中的行号
CMAKE_MODULE_PATH用于查找额外 CMake 模块(.cmake 文件)的搜索路径列表
CMAKE_INCLUDE_CURRENT_DIR若设为 ON,将在构建时自动将当前 CMakeLists.txt 目录添加到包含路径中
CMAKE_LIBRARY_OUTPUT_DIRECTORY库文件的输出目录
CMAKE_RUNTIME_OUTPUT_DIRECTORY可执行文件的输出目录

预设变量详解

  1. CMAKE_CURRENT_SOURCE_DIR

    • 它指定了当前正在处理的 CMakeLists.txt 文件所在的目录。当你在多级目录结构中使用 add_subdirectory() 时,这个变量会随着上下文切换而变化,总是指向当前 CMakeLists.txt 文件所在的路径。
  2. PROJECT_SOURCE_DIR

    • 这个变量代表了项目的顶层(根)源代码目录,即包含初始 project() 命令的那个 CMakeLists.txt 文件所在的目录。
  3. CMAKE_CURRENT_BINARY_DIR

    • 表示当前 CMakeLists.txt 文件对应的构建目录,在构建过程中,这里的路径是指构建时产生的中间文件和目标文件的存放位置。
  4. PROJECT_BINARY_DIR

    • 同样代表项目顶层的构建目录,也就是在项目根目录下执行 cmake 时生成的构建文件的父目录,通常相对于 PROJECT_SOURCE_DIR,它是一个独立的 build 目录。
  5. CMAKE_BINARY_DIR

    • 在单个顶级 CMake 构建中,CMAKE_BINARY_DIR 等同于 PROJECT_BINARY_DIR,但在多级构建配置中,它指的是最外层或“顶级”构建目录。
  6. CMAKE_SOURCE_DIR

    • 这个变量类似于 PROJECT_SOURCE_DIR,不过在多目录外部项目(ExternalProject)中可能有所不同,一般情况下两者相同,都指向项目根目录。
  7. CMAKE_MODULE_PATH

    • 用于搜索 CMake 模块的额外路径列表。
  8. CMAKE_CURRENT_LIST_DIR

    • 表示当前正在处理的 CMakeLists.txt 或 CMake 模块文件的实际物理路径。
  9. CMAKE_CURRENT_LIST_FILE

    • 包含当前正在执行的 CMakeLists.txt 或 CMake 模块文件的完整路径。

其他预定义变量:

  • CMAKE_GENERATOR

    • 当前使用的构建工具链(如 “Unix Makefiles”、“MinGW Makefiles”、“Ninja” 等)。
  • CMAKE_BUILD_TYPE

    • 指定构建类型(如 “Debug”、“Release” 等)。
  • CMAKE_<LANG>_COMPILER

    • 指定用于特定语言(如 C、CXX)的编译器路径。
  • CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_VERSION, CMAKE_SYSTEM_PROCESSOR

    • 描述目标系统的名称、版本和处理器架构。

以上这些变量在CMake中都是全局可用的,可以帮助开发者灵活地处理不同层级的目录结构、构建选项以及系统相关的配置信息。此外,还有许多其他的预定义变量,具体可查阅CMake官方文档以获取完整列表及最新说明。

设置CMAKE预定义变量 set()

设置 项目构建

  • if(WIN32) set(CMAKE_GNUtoMS ON) endif(WIN32) # 如果是window平台,
  • set(CMAKE_BUILD_RPATH “${CMAKE_SOURCE_DIR}/build” ) 构建目录 ./build
  • set(CMAKE_BUILD_TYPE Debug)

设置编译选项 编译链 编译器

  • set(CMAKE_CXX_STANDARD 11)
  • set(CMAKE_CXX_STANDARD_REQUIRED True)
  • set(CMAKE_C_COMPILER “gcc”)
  • set(CMAKE_CXX_COMPILER “g++”)

设置 项目输出

  • set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
  • set(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
  • set(CMAKE_RUNTIME_OUTPUT_DIRECTORY)

添加编译选项

add_compile_options

add_compile_options(-Wall -Wextra -pedantic   ) 

add_definitions(-DDEBUG -DMYDEFINE) 添加宏定义


搜寻&添加 源文件 .c .cpp .s

aux_source_directory

  • aux_source_directory:该命令可以搜索指定目录(第一个参数)下的所有源文件,将源文件的列表保存到指定的变量(第二个参数)。

aux_source_directory(. MATH_SRC)

file(GLOB )

  • file(GLOB ):该命令可以搜索指定目录(第一个参数)下的所有源文件,将源文件的列表保存到指定的变量(第二个参数)。

file(GLOB MATH_SRC *.cpp)

搜索&添加 头文件 .h .hpp

target_include_directories

  • target_include_directories(target_name PRIVATE/PUBLIC/INTERFACE Directory1 Directory2 …)
  • 这可以确保自定义路径只应用于特定的目标,并使得相关路径不会泄漏到其他目标中。

target_link_directories

  • target_link_directories(target_name PRIVATE/PUBLIC/INTERFACE Directory1 Directory2 …)
  • 这可以确保自定义路径只应用于特定的目标,并使得相关路径不会泄漏到其他目标中。

include_directories

  • 添加头文件包含路径 全局
  • include_directories(path1 path2 …)

link_directories

  • 添加头文件包含路径 全局
  • link_directories(path1 path2 …)

需要注意的是

  1. 尽量避免在 CMake 中使用 include_directorieslink_directories 命令来处理第三方库的头文件和链接库路径。
  2. 更好的做法是使用 find_package 命令或编写 Find 模块来查找和链接第三方库,这样可以更好地管理依赖关系和跨平台兼容性。

创建构建目标

add_library 静态/动态/组件库

add_library( [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[…])

add_executable 可执行文件

add_executable( [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 …])

add_subdirectory :纳入子CMake构建配置

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM]
)
  • add_subdirectory( directory ) 用于将一个子目录及其内部的CMake构建配置纳入当前项目的构建过程。这个命令允许您组织大型项目为多个独立的子项目或模块,每个子项目都有自己的CMakeLists.txt文件,它们共同构成整个项目的构建规则。

  • source_dir:必填参数,指定包含子目录CMakeLists.txt文件的路径。可以是相对路径(相对于当前CMakeLists.txt文件所在目录)或绝对路径。CMake将递归地处理指定目录下的CMakeLists.txt文件,构建该子目录内的目标。

  • binary_dir:可选参数,指定子目录构建产物(如编译后的对象文件、库文件和可执行文件)存放的目录。如果未指定,CMake将默认在当前构建目录下创建一个与source_dir同名的子目录作为binary_dir。如果提供的是相对路径,它将相对于当前构建目录计算。

  • EXCLUDE_FROM_ALL:可选布尔标记,如果设置,该子目录中的目标将不会被默认构建。用户必须明确指定这些目标才能进行构建。这对于包含可选组件、测试套件或示例代码等的子目录非常有用,可以避免不必要的构建开销。

target_link_libraries

 target_link_libraries(<target><PRIVATE|PUBLIC|INTERFACE> <items>...[<PRIVATE|PUBLIC|INTERFACE> <items>...]...[LINK_INTERFACE_LIBRARIES <items>...][LINK_PRIVATE <items>...][LINK_PUBLIC <items>...][LINK_INTERFACE_MULTIPLICITY <library> <count>...]
)
  • 负责将库文件、其他目标(如静态库或共享库)以及链接标志与给定的目标(通常是可执行文件或库)关联起来。
  • 可以清晰地定义项目中各个组成部分之间的依赖关系,确保编译器在构建目标时能正确链接所需的库文件。

设置目标属性

set_target_properties设置的属性

set_target_properties(${module_name}    PROPERTIESproperty1 value1property2 value2.....
)
set_target_properties(my_target PROPERTIES COMPILE_DEFINITIONS MY_DEFINITION=ON)

set_property

set_property([GLOBAL | DIRECTORY | TARGET <target-name> |SOURCE <source-file> | TEST <test-name> |INSTALL <install-target> | CACHE | ENVIRONMENT]PROPERTY <property-name> [value1 [value2 ...]]
)
set_property(TARGET my_target PROPERTY COMPILE_DEFINITIONS MY_DEFINITION=ON)
  • set_target_properties 语法更紧凑
  • sett_property 作用范围更丰富

PROPERTIES

  • OUTPUT_NAME 输出文件名字
  • PREFIX 输出文件前缀

  • ARCHIVE_OUTPUT_DIRECTORY 输出导入库路径 dll.a
  • LIBRARY_OUTPUT_DIRECTORY 输出库文件库路径 .a .lib
  • RUNTIME_OUTPUT_DIRECTORY 输出可执行文件路径 .exe .dll

导入静态/动态库文件

https://zhuanlan.zhihu.com/p/373363335

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

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

相关文章

LeetCode-1143. 最长公共子序列【字符串 动态规划】

LeetCode-1143. 最长公共子序列【字符串 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;动规五部曲解题思路二&#xff1a;1维DP解题思路三&#xff1a;0 题目描述&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。…

【2024年MathorCup数模竞赛】C题赛题与解题思路

2024年MathorCup数模竞赛C题 题目 物流网络分拣中心货量预测及人员排班背景求解问题 解题思路问题一问题二问题三问题四 本次竞赛的C题是对物流网络分拣中心的货量预测及人员排班问题进行规划。整个问题可以分为两个部分&#xff0c;一是对时间序列进行预测&#xff0c;二是对人…

通往大厂Java面试题及参考答案2万字长文

目录 解释Java的基本数据类型及其大小 描述Java中的类加载机制 什么是Java的反射机制?

【示例】MySQL-索引失效的情况

前言 本文主要讲述MySQL中索引失效的常见情况。 case1&#xff1a;索引列参与函数运算 # 索引失效 explain select * from tb_user where substring(phone,10,2) 15;case2&#xff1a;数据库的隐式类型转换 对于字符串类型的索引列&#xff0c;是否加引号不会对查询结果产…

【MATLAB源码-第186期】matlab基于MLE算法的8天线阵列DOA估计仿真,对比粗估计、精确估计输出RMSE对比图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 第一部分&#xff1a;基本概念与系统设置 方向到达估计&#xff08;Direction of Arrival, DOA&#xff09;是信号处理中一项重要的技术&#xff0c;主要用于确定信号的到达方向。这种技术在雷达、无线通信和声纳等领域中有…

蓝桥杯省赛冲刺(3)广度优先搜索

广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是一种在图或树等非线性数据结构中遍历节点的算法&#xff0c;它从起始节点开始&#xff0c;按层级逐步向外扩展&#xff0c;即先访问离起始节点最近的节点&#xff0c;再访问这些节点的邻居&#xff0c;然后是邻…

异常处理java

在Java中&#xff0c;异常处理可以使用"throws"关键字或者"try-catch"语句。这两种方法有不同的用途和适用场景。 "throws"关键字: 在方法声明中使用"throws"关键字&#xff0c;表示该方法可能会抛出异常&#xff0c;但是并不立即处理…

python脚本一键删除匹配项的所有key

1、安装redis模块 pip3 install redis Looking in indexes: http://mirrors.cloud.aliyuncs.com/pypi/simple/ Collecting redisDownloading http://mirrors.cloud.aliyuncs.com/pypi/packages/bb/f1/a384c5582d9a28e4a02eb1a2c279668053dd09aafeb08d2bd4dd323fc466/redis-5.0…

有关格式输入输出的问题

对于格式输入输出问题&#xff0c;我们最好用c语言编写代码&#xff01;&#xff01;&#xff01; 成绩统计 难点&#xff1a;格式化输出 #include <cstdio> using namespace std; typedef long long ll;ll n,score,a,b;int main() {//及格>60 优秀>85 求及格率…

变更docker的缓存路径

承接上一篇文章&#xff0c;定期清理docker&#xff0c;仍感觉有些累&#xff0c;这个变更一下缓存路径&#xff0c;可以根本解决问题。 linux磁盘清理_docker/overlay2爆满_linux overlay目录满了-CSDN博客 当然&#xff0c;变更docker的缓存路径&#xff0c;也可以使用上一…

mysql题目1

tj11: ​ select * from t_student where grade 大一 and major 软件工程 ​ tj12: SELECTt_student.name, count(t_choice.cid)FROMt_choiceINNER JOINt_courseON t_choice.cid t_course.idINNER JOINt_studentON t_choice.sid t_student.id GROUP BYt_choice.sid HAVIN…

PyTorch神经网络打印存储所有权重+激活值(运行时中间值)

很多时候嵌入式或者新硬件需要纯净的权重模型和激活值&#xff08;运行时中间值&#xff09;&#xff0c;本文提供一种最简洁的方法。 假设已经有模型model和pt文件了&#xff0c;在当前目录下新建weights文件夹&#xff0c;运行最后三行代码&#xff0c;就可以得到模型的权重&…

《疯狂java讲义》Java AWT图形化编程中文显示

《疯狂java讲义》第六版第十一章AWT中文没有办法显示问题解决 VM Options设置为-Dfile.encodinggbk 需要增加变量 或者这边直接设置gbk 此外如果用swing 就不会产生这个问题了。

京东采集器使用教程 京东商家爬虫软件分享

京东采集器是一款功能强大的京东商家爬虫软件&#xff0c;可以帮助用户快速采集京东商家的商品信息&#xff0c;并提供丰富的数据分析功能。 第一步&#xff1a;安装及配置 首先&#xff0c;你需要下载并安装京东采集器软件。下载完成后&#xff0c;双击安装文件并按照提示完…

YOLOv8最新改进系列:融合最新顶会提出的HCANet网络中卷积和注意力融合模块(CAFM),有效提升小目标检测性能,大幅度拉升目标检测效果!遥遥领先!

YOLOv8最新改进系列&#xff1a;YOLOv8最新改进系列:融合最新顶会提出的HCANet网络中卷积和注意力融合模块(CAFM)&#xff0c;有效提升小目标检测性能&#xff0c;大幅度拉升目标检测效果&#xff01;遥遥领先&#xff01; B站全文戳这里&#xff01; 详细的改进教程以及源码…

ZGC的介绍

背景 在jdk17中已经将ZGC从实验性产品升级到正式产品功能&#xff0c;达到亚毫秒级停顿&#xff0c;毫不留情地将parallel和G1拉开了数量级的差别&#xff0c;无论是平均停顿还是最大停顿时间都能毫不费劲地控制在10ms内。 《深入理解Java虚拟机》在书中这样定义&#xff1a;Z…

Python3.7编程之病毒

基础篇 什么是病毒 病毒&#xff0c;指的是一些通过非法手段获取系统的一些权限&#xff0c;然后进行破坏或者盗取。 病毒分为两类&#xff1a; 1、破坏型 这类病毒往往会将系统弄的乱七八糟&#xff0c;比如把你的U盘删光&#xff0c;把你的系统背景调成黑客图片&#xff0c…

CorelDRAW苹果版提示请重新连接具有文件位置的设备...的解决方法

今天小编想更新一下CorelDRAW2024苹果版&#xff0c;但升级完成依次提示“请重新连接具有文件位置的设备&#xff0c;或选择新文件夹。同时&#xff0c;内容将保存在Corel 默认位置。您可以在恢复文件位置之后移动内容”和“尝试重新启动计算机和应用程序。如果这些操作还是不能…

python 的join函数

join函数是一个对字符串处理的函数 字符串.join(str)的含义是把字符串加入到str的每一个间隙里面 如 str1234 ,.join(str) #打印的结果为 1,2,3,4

【03709】24年4月马克思主义基本原理概论考前密训—选择/简答题-2

目录 1.习题精析 2.高频考点(简答)— 社会革命和社会改革的区别