cmake学习(二)常用变量和常用环境变量

本文介绍了CMake的高级使用技巧,包括变量引用、自定义变量设置、环境变量调用及内置变量的应用。此外还讲解了如何区分Debug和Release版本以及指定编译目标为32位或64位的方法。

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

一、变量的引用方式是使用“${}”,在IF中,不需要使用这种方式,直接使用变量名即可
二、自定义变量使用SET(OBJ_NAME xxxx),使用时${OBJ_NAME}
三、cmake的常用变量:
CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIR:
这三个变量内容一致,如果是内部编译,就指的是工程的顶级目录,如果是外部编译,指的就是工程编译发生的目录。
CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIR:
这三个变量内容一致,都指的是工程的顶级目录。
CMAKE_CURRENT_BINARY_DIR:外部编译时,指的是target目录,内部编译时,指的是顶级目录
CMAKE_CURRENT_SOURCE_DIR:CMakeList.txt所在的目录
CMAKE_CURRENT_LIST_DIR:CMakeList.txt的完整路径
CMAKE_CURRENT_LIST_LINE:当前所在的行
CMAKE_MODULE_PATH:如果工程复杂,可能需要编写一些cmake模块,这里通过SET指定这个变量
LIBRARY_OUTPUT_DIR,BINARY_OUTPUT_DIR:库和可执行的最终存放目录
PROJECT_NAME:你猜~~

四、cmake中调用环境变量
1.Using $ENV{NAME} : invoke system environment varible.
We can use "SET(ENV{NAME} value)" as well. note that the "ENV" without "$".
2.CMAKE_INCLUDE_CURRENT_DIR equal to INCLUDE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

五、其他的内置变量
1.BUILD_SHARED_LIBS:set the default value when using ADD_LIBRARY()
   ON 或 OFF
2.CMAKE_C_FLAGS: set compiler for c language
2.CMAKE_CXX_FLAGS: set compiler for c++ language

六、区分debug和release
在工程目录下,cmake -DCMAKE__BUILD_TYPE=DEBUG(RELEASE),再执行make

七、指定编译32bit或64bit程序
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
<think>我们有两个目标: 1. 在.sh脚本中设置CMake环境变量 2. 确保在CMakeLists.txt中可以读取到这些环境变量 根据引用[1]引用[2]: - 在CMake中,使用`$ENV{NAME}`可以获取环境变量。 - 在shell脚本中,我们可以使用`export`命令设置环境变量,这些环境变量会被子进程(包括CMake)继承。 另外,引用[4]展示了在shell脚本中设置环境变量并在CMakeLists.txt中读取的示例。 因此,在.sh脚本中设置CMake环境变量的步骤如下: ### 步骤 1. 在shell脚本中使用`export`命令设置环境变量。 2. 在CMakeLists.txt中使用`$ENV{变量名}`来获取该环境变量的值。 ### 示例 #### 1. 编写shell脚本(例如`build.sh`) ```bash #!/bin/bash # 设置环境变量 export MY_VARIABLE="my_value" export ANOTHER_VARIABLE="another_value" # 进入构建目录(可选) mkdir -p build cd build # 运行CMake,此时CMake会继承当前shell环境变量 cmake .. # 构建 cmake --build . ``` #### 2. 在CMakeLists.txt中读取环境变量 ```cmake # 输出环境变量 message(STATUS "MY_VARIABLE = $ENV{MY_VARIABLE}") message(STATUS "ANOTHER_VARIABLE = $ENV{ANOTHER_VARIABLE}") # 使用环境变量进行条件判断 if(DEFINED ENV{MY_VARIABLE}) message(STATUS "MY_VARIABLE is defined") # 根据环境变量的值执行不同的操作 if("$ENV{MY_VARIABLE}" STREQUAL "my_value") message(STATUS "The value is correct") endif() endif() ``` ### 注意事项 - 环境变量只在当前shell会话及其子进程中有效。如果关闭了终端,环境变量就会消失。 - 如果希望环境变量永久生效,可以将`export`命令添加到`~/.bashrc`或`~/.profile`中(如引用[3]所示),但通常在脚本中设置是临时的。 - 在CMakeLists.txt中,使用`$ENV{...}`获取的是运行CMake时父进程(即shell脚本)中设置的环境变量值。 ### 完整示例脚本 以下是一个完整的构建脚本示例(参考引用[5]并加入环境变量设置): ```bash #!/bin/bash # 设置环境变量 export BUILD_TYPE="Release" export PROJECT_NAME="MyProject" # 清理构建目录 echo "清理构建目录..." rm -rf build mkdir build cd build # 配置CMake,并传递环境变量(注意:环境变量会自动传递) echo "配置CMake..." cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. # 构建项目 echo "构建项目..." cmake --build . --config $BUILD_TYPE # 可选:运行测试 # echo "运行测试..." # ctest echo "构建完成!" ``` ### 相关问题 1. 如何在CMake中设置环境变量? 2. 环境变量CMakeshell脚本之间传递的机制是什么? 3. 如何让设置的环境变量永久生效? 4. 在CMakeLists.txt中如何修改环境变量并影响后续的构建步骤? ### 引用说明 - 在shell脚本中设置环境变量使用`export`命令[^4]。 - 在CMakeLists.txt中读取环境变量使用`$ENV{变量名}`[^1][^2]。 - 环境变量在子进程中继承是Unix/Linux系统的特性。 [^1]: cmake 常用变量常用环境变量--整理 [^2]: CMake搭建编译环境总结 [^4]: shell脚本中设置环境变量并在CMake中读取的示例</think>### 如何在.sh脚本中设置CMake环境变量Shell脚本中为CMake设置环境变量主要通过`export`命令实现,这些变量会在CMake执行时被继承。以下是详细配置方法: #### 1. **基础环境变量设置** 在.sh脚本中使用`export`定义变量: ```bash #!/bin/bash # 设置CMake环境变量 export CMAKE_PREFIX_PATH="/opt/custom/libs:$CMAKE_PREFIX_PATH" export CXXFLAGS="-O2 -Wall" ``` - `export`:使变量对子进程(包括CMake)可见 - `CMAKE_PREFIX_PATH`:指定库文件的搜索路径[^1] - `CXXFLAGS`:设置C++编译选项 #### 2. **条件设置环境变量** 根据参数动态设置变量: ```bash #!/bin/bash if [ "$1" == "gpu" ]; then export CMAKE_CUDA_ARCHITECTURES="80" # NVIDIA A100架构 export ENABLE_CUDA=ON fi ``` - `$1`:获取脚本的第一个参数 - 条件判断设置特定硬件的编译选项 #### 3. **在CMakeLists.txt中使用环境变量** CMake通过`$ENV{NAME}`读取环境变量: ```cmake # 读取环境变量 message(STATUS "CUDA ARCH: $ENV{CMAKE_CUDA_ARCHITECTURES}") # 条件编译 if(DEFINED ENV{ENABLE_CUDA} AND "$ENV{ENABLE_CUDA}" STREQUAL "ON") find_package(CUDA REQUIRED) endif() ``` #### 4. **临时修改环境变量** 在单次CMake调用前设置变量: ```bash #!/bin/bash # 临时覆盖变量 ENABLE_TEST=ON cmake -B build -DCMAKE_BUILD_TYPE=Release ``` - 语法:`VAR=value command` - 仅影响本次命令执行 #### 5. **完整示例脚本** ```bash #!/bin/bash # build.sh export PROJECT_DEPS_PATH="/opt/project_deps" export CXX="clang++" mkdir -p build && cd build cmake .. \ -DCMAKE_PREFIX_PATH="$ENV{PROJECT_DEPS_PATH}" \ -DCMAKE_CXX_COMPILER="$ENV{CXX}" make -j$(nproc) ``` ### 关键注意事项 1. **作用域规则** - `export`设置的变量对**所有子进程**有效 - 未导出的变量(如`VAR=value`)仅对当前Shell有效 - 变量在脚本退出后自动失效(除非写入`~/.bashrc`) 2. **CMake变量优先级** ```mermaid graph LR A[CMake命令行参数] -->|最高优先级| B[缓存变量] B --> C[环境变量] C --> D[CMake默认值] ``` 3. **特殊环境变量** | 变量名 | 用途 | 示例 | |--------|------|------| | `CMAKE_PREFIX_PATH` | 库搜索路径 | `export CMAKE_PREFIX_PATH=/opt/qt5` | | `CC/CXX` | 指定编译器 | `export CC=clang` | | `CFLAGS/CXXFLAGS` | 编译选项 | `export CXXFLAGS="-O3 -march=native"` | | `PKG_CONFIG_PATH` | pkg-config路径 | `export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig` | ### 验证方法 1. 在CMakeLists.txt中添加检测: ```cmake message(STATUS "Current ENV: ") execute_process(COMMAND "env" OUTPUT_VARIABLE ENV_VARS) message(STATUS "${ENV_VARS}") ``` 2. 使用`env`命令查看: ```bash env | grep CMAKE # 查看所有CMake相关环境变量 ``` ### 相关问题 1. 如何在CMake中永久设置环境变量? 2. 环境变量CMake缓存变量有何区别?[^1] 3. 如何跨平台设置环境变量(Windows/Linux/macOS)? 4. CMake的`find_package`如何利用`CMAKE_PREFIX_PATH`? 5. 为什么有时环境变量CMake中读取不到? [^1]: CMake 常用变量环境变量设置方法 [^2]: 在 Shell 脚本中设置读取环境变量 [^4]: CMakeLists.txt 读取环境变量的条件判断示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值