CMake常用变量和常量环境变量查表手册——整理

本文详细介绍了CMake的变量引用方式、自定义变量、常用内置变量、调用环境变量的方法,以及CMAKE_MODULE_PATH、CMAKE_INCLUDE_CURRENT_DIR等重要选项。还列举了如CMAKE_BINARY_DIR、CMAKE_SOURCE_DIR等核心变量的用途,并讲解了如何通过FIND_PACKAGE和自定义模块来查找库。此外,文章还探讨了如何使用IF、WHILE、FOREACH等控制指令,以及如何利用EXEC_PROGRAM执行命令。通过对CMake深入的理解,读者能够更好地管理和构建复杂的项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,cmake 变量引用的方式:

前面我们已经提到了,使用${}进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过${}取值

二,cmake 自定义变量的方式:

主要有隐式定义和显式定义两种,前面举了一个隐式定义的例子,就是 PROJECT 指令,他会隐式的定义<projectname>_BINARY_DIR 和<projectname>_SOURCE_DIR 两个变量。
显式定义的例子我们前面也提到了,使用 SET 指令,就可以构建一个自定义变量了。
比如:
SET(HELLO_SRC main.SOURCE_PATHc),就 PROJECT_BINARY_DIR 可以通过${HELLO_SRC}来引用这个自定义变量了.
 

三,cmake 常用变量:

1,CMAKE_BINARY_DIR
  PROJECT_BINARY_DIR
 <projectname>_BINARY_DIR
这三个变量指代的内容是一致的,如果是 in source 编译,指得就是工程顶层目录,如果是 out-of-source 编译,指的是工程编译发生的目录。PROJECT_BINARY_DIR 跟其他指令稍有区别,现在,你可以理解为他们是一致的。
2,CMAKE_SOURCE_DIR
   PROJECT_SOURCE_DIR
   <projectname>_SOURCE_DIR
这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。
也就是在 in source 编译时,他跟 CMAKE_BINARY_DIR 等变量一致。
PROJECT_SOURCE_DIR 跟其他指令稍有区别,现在,你可以理解为他们是一致的。

3,CMAKE_CURRENT_SOURCE_DIR
指的是当前处理的 CMakeLists.txt 所在的路径,比如上面我们提到的 src 子目录。

4,CMAKE_CURRRENT_BINARY_DIR
如果是 in-source 编译,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,如果是 out-of-source 编译,他指的是 target 编译目录。
使用我们上面提到的 ADD_SUBDIRECTORY(src bin)可以更改这个变量的值。
使用 SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对这个变量造成影响,它仅仅修改了最终目标文件存放的路径。

5,CMAKE_CURRENT_LIST_FILE

输出调用这个变量的 CMakeLists.txt 的完整路径

 

6,CMAKE_CURRENT_LIST_LINE

输出这个变量所在的行

 

7,CMAKE_MODULE_PATH
这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设置一下。
比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
这时候你就可以通过 INCLUDE 指令来调用自己的模块了。

8,EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH
分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。

9,PROJECT_NAME
返回通过 PROJECT 指令定义的项目名称。
 

四,cmake 调用环境变量的方式

使用$ENV{NAME}指令就可以调用系统的环境变量了。
比如
MESSAGE(STATUS “HOME dir: $ENV{HOME}”)
设置环境变量的方式是:
SET(ENV{变量名} 值)
1,CMAKE_INCLUDE_CURRENT_DIR
自动添加 CMAKE_CURRENT_BINARY_DIR 和 CMAKE_CURRENT_SOURCE_DIR 到当前处理
的 CMakeLists.txt。相当于在每个 CMakeLists.txt 加入:
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR})

2,CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE
将工程提供的头文件目录始终至于系统头文件目录的前面,当你定义的头文件确实跟系统发生冲突时可以提供一些帮助。

3,CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH 我们在上一节已经提及。

五,系统信息

1,CMAKE_MAJOR_VERSION,CMAKE 主版本号,比如 2.4.6 中的 2
2,CMAKE_MINOR_VERSION,CMAKE 次版本号,比如 2.4.6 中的 4
3,CMAKE_PATCH_VERSION,CMAKE 补丁等级,比如 2.4.6 中的 6
4,CMAKE_SYSTEM,系统名称,比如 Linux-2.6.22
5,CMAKE_SYSTEM_NAME,不包含版本的系统名,比如 Linux
6,CMAKE_SYSTEM_VERSION,系统版本,比如 2.6.22
7,CMAKE_SYSTEM_PROCESSOR,处理器名称,比如 i686.
8,UNIX,在所有的类 UNIX 平台为 TRUE,包括 OS X 和 cygwin
9,WIN32,在所有的 win32 平台为 TRUE,包括 cygwin

六,主要的开关选项:

1,CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS,用来控制 IF ELSE 语句的书写方式,在
下一节语法部分会讲到。
2,BUILD_SHARED_LIBS
这个开关用来控制默认的库编译方式,如果不进行设置,使用 ADD_LIBRARY 并没有指定库
类型的情况下,默认编译生成的库都是静态库。
如果 SET(BUILD_SHARED_LIBS ON)后,默认生成的为动态库。
3,CMAKE_C_FLAGS
设置 C 编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
4,CMAKE_CXX_FLAGS
设置 C++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
小结:
本章介绍了一些较常用的 cmake 变量,这些变量仅仅是所有 cmake 变量的很少一部分,目
前 cmake 的英文文档也是比较缺乏的,如果需要了解更多的 cmake 变量,更好的方式是阅
读一些成功项目的 cmake 工程文件,比如 KDE4 的代码。
 

八,cmake 常用指令

前面我们讲到了 cmake 常用的变量,相信“cmake 即编程”的感觉会越来越明显,无论如何,我们仍然可以看到 cmake 比 autotools 要简单很多。接下来我们就要集中的看一看cmake 所提供的常用指令。在前面的章节我们已经讨论了很多指令的用法,如
PROJECT,ADD_EXECUTABLE,INSTALL,ADD_SUBDIRECTORY,SUBDIRS,
INCLUDE_DIRECTORIES,LINK_DIRECTORIES,TARGET_LINK_LIBRARIES,SET 等。
本节会引入更多的 cmake 指令,为了编写的方便,我们将按照 cmake man page 的顺序来介绍各种指令,不再推荐使用的指令将不再介绍,INSTALL 系列指令在安装部分已经做了非常详细的说明,本节也不在提及。(你可以将本章理解成选择性翻译,但是会加入更多的个人理解)

一,基本指令
1,ADD_DEFINITIONS
向 C/C++编译器添加-D 定义,比如:

### CMake 环境变量配置与作用 CMake 作为一种跨平台的构建工具,其行为可以通过环境变量进行定制控制。这些环境变量可以影响 CMake 的编译器选择、编译选项、库查找路径等关键行为。以下是关于 CMake 环境变量的配置方法及其主要作用的详细说明。 #### 常见 CMake 环境变量及其作用 1. **`CC` `CXX`** 这两个环境变量用于指定 C C++ 编译器的路径。在配置项目时,CMake 会优先使用这两个变量来确定使用的编译器。例如: ```bash export CC=/usr/bin/gcc export CXX=/usr/bin/g++ ``` 如果未设置,CMake 会尝试根据系统默认的编译器进行检测并使用[^3]。 2. **`CMAKE_C_FLAGS` `CMAKE_CXX_FLAGS`** 这些变量用于设置 C C++ 编译器的全局编译选项。例如,在 CMakeLists.txt 中添加对 C++11 标准的支持: ```cmake if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") message(STATUS "optional:-std=c++11") endif(CMAKE_COMPILER_IS_GNUCXX) ``` 上述代码片段通过修改 `CMAKE_CXX_FLAGS` 来为 GNU C++ 编译器添加 `-std=c++11` 选项[^2]。 3. **`CMAKE_PREFIX_PATH`** 该变量用于指定查找外部依赖库的根目录列表。当使用 `find_package()` 命令时,CMake 会在此路径中搜索相关的包配置文件(如 `XXXConfig.cmake` 或 `xxx.pc` 文件)。例如: ```bash export CMAKE_PREFIX_PATH=/opt/mylibs:/home/user/local ``` 设置此变量可以简化第三方库的集成过程,尤其是在自定义安装路径的情况下[^1]。 4. **`CMAKE_INCLUDE_PATH` `CMAKE_LIBRARY_PATH`** - `CMAKE_INCLUDE_PATH` 指定头文件的搜索路径。 - `CMAKE_LIBRARY_PATH` 指定链接库的搜索路径。 这两个变量主要用于辅助 `find_path()` `find_library()` 命令的执行,确保 CMake 能够正确找到所需的头文件库文件。 5. **`CMAKE_BUILD_TYPE`** 该变量用于指定构建类型,常见的取值包括 `Debug`、`Release`、`RelWithDebInfo` `MinSizeRel`。不同的构建类型会影响编译器的优化级别调试信息的生成方式。例如: ```bash cmake -DCMAKE_BUILD_TYPE=Release .. ``` 此命令将构建类型设置为 `Release`,通常用于最终发布版本的构建。 6. **`CMAKE_INSTALL_PREFIX`** 该变量用于指定项目的安装路径,默认情况下是 `/usr/local`。可以通过以下方式修改安装路径: ```bash cmake -DCMAKE_INSTALL_PREFIX=/opt/myapp .. ``` 在多用户环境中或需要将软件安装到非标准位置时,该变量非常有用[^1]。 7. **`CMAKE_TOOLCHAIN_FILE`** 该变量用于指定交叉编译工具链文件的路径。当需要为不同架构的目标平台构建项目时,可以通过此变量指定工具链配置文件,从而覆盖默认的编译器相关设置。例如: ```bash cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake .. ``` 工具链文件通常包含目标平台的编译器路径、系统名称、根文件系统等信息。 #### 配置方法 - **临时配置** 在运行 `cmake` 命令时,可以通过 `-D` 参数直接传递变量值。例如: ```bash cmake -DCMAKE_BUILD_TYPE=Debug .. ``` - **永久配置** 可以通过修改环境变量或在 CMakeLists.txt 中使用 `set()` 命令来设置变量。例如: ```cmake set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") ``` - **工具链文件** 对于复杂的项目或交叉编译场景,建议创建一个独立的工具链文件,并通过 `CMAKE_TOOLCHAIN_FILE` 指定其路径。工具链文件可以集中管理所有与平台相关的配置,提高可维护性。 #### 总结 CMake 提供了丰富的环境变量支持,开发者可以根据具体需求灵活配置。理解并合理使用这些变量,有助于提升项目的可移植性构建效率。特别是在处理跨平台项目或集成第三方库时,正确的环境变量配置能够显著简化开发流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值