CMake简单笔记

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}    PROPERTIES
    property1 value1
    property2 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

相关推荐

  1. CMake简单笔记

    2024-04-13 10:36:11       37 阅读
  2. cmake学习笔记2

    2024-04-13 10:36:11       40 阅读
  3. Cmake学习笔记3

    2024-04-13 10:36:11       41 阅读
  4. CMake 学习笔记(访问Python)

    2024-04-13 10:36:11       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-13 10:36:11       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-13 10:36:11       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-13 10:36:11       82 阅读
  4. Python语言-面向对象

    2024-04-13 10:36:11       91 阅读

热门阅读

  1. (第四章)管理数组和字符串

    2024-04-13 10:36:11       38 阅读
  2. 从零开始,如何成功进入IT行业?

    2024-04-13 10:36:11       44 阅读
  3. 蓝桥杯练习题 —— Fibonacci数列(python)

    2024-04-13 10:36:11       34 阅读
  4. L2-008 最长对称子串(manacher()算法)

    2024-04-13 10:36:11       38 阅读
  5. 嵌入式之数据结构篇(五)

    2024-04-13 10:36:11       38 阅读
  6. Gobalt Strike基础

    2024-04-13 10:36:11       32 阅读