命令行定义的WITH_FOO变量与CMakeLists.txt中option的差异及相关问询
命令行定义变量与CMake option变量的差异及问题解答
两者核心差异
- 优先级:命令行通过
-D参数定义的变量,优先级高于CMakeLists.txt中option指令定义的变量。只要命令行传入了对应变量,option设置的默认值会被直接覆盖。 - 定义时机:命令行变量在CMake启动配置阶段就被传入并加载;
option变量则是CMake执行到脚本中对应option代码行时才会定义(如果变量未存在的话)。 - 类型限制:
option是专门用于布尔型开关的指令,仅支持ON/OFF两类值,会自动处理非布尔输入的转换;而命令行-D可以定义任意类型的变量(字符串、数字等),布尔相关变量需要显式指定ON/OFF等值。 - 缓存特性:命令行定义的变量会被写入CMakeCache.txt缓存文件,后续重新配置如果不主动覆盖,会保持之前的取值;
option仅在变量未被定义(包括缓存中无记录)时,才会设置默认值。
问题解答
问题1:执行命令cmake .. -DWITH_FOO=ON时,是否通过该命令行定义了名为WITH_FOO的变量?
是。从执行输出里的Attention! FOO is enabled!提示可以看出,WITH_FOO被设置为ON,覆盖了CMakeLists.txt中option的默认值off,证明命令行成功定义了该变量。
问题2:若上述问题答案为是,当执行不带-DWITH_FOO=ON的cmake ..命令时,CMakeLists.txt中的option是否也会定义名为WITH_FOO的变量?
是。option指令的核心逻辑是:如果目标变量(此处为WITH_FOO)尚未被定义(无论是命令行未传入、缓存中无记录的情况),就会用指定的默认值(此处为off)创建并初始化该变量。即使没有命令行参数,执行到option(WITH_FOO "whether FOO is enabled or not" off)这一行时,CMake会自动创建WITH_FOO变量并设为OFF,只是此时不会触发if(WITH_FOO)分支里的提示信息。
附:相关代码与执行输出
调用CMake的Shell脚本
rm -rf build && mkdir build && cd build && cmake .. -DWITH_FOO=ON
CMakeLists.txt内容
cmake_minimum_required(VERSION 3.13) option(WITH_FOO "whether FOO is enabled or not" off) if(WITH_FOO) message("Attention! FOO is enabled!") add_compile_definitions(WITH_FOO_ENABLED) endif() add_executable(demo main.c)
main.c内容
int main(){return 0;}
执行脚本后的输出
-- The C compiler identification is GNU 4.9.4 -- The CXX compiler identification is GNU 4.9.4 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done Attention! FOO is enabled! -- Configuring done -- Generating done -- Build files have been written to: /data/Jhon/demo/build
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

