调用CMake时如何追加CXX_FLAGS而不覆盖推断变量?
如何在调用CMake时向推断变量追加内容而不覆盖?
当然可以做到!你有几个不错的方案,既不用手动先获取原有flags再追加,还能保留CMake自动推断的编译选项,同时满足C++11的需求。
1. 优先使用CMake官方的C++标准支持变量(推荐)
CMake提供了专门控制C++标准的变量,这是跨平台的最佳实践,完全不需要手动写-std=c++11这类编译器特定的flag:
cmake -DCMAKE_CXX_STANDARD=11 -DCMAKE_CXX_STANDARD_REQUIRED=ON ../source_dir
CMAKE_CXX_STANDARD=11告诉CMake你需要C++11支持,它会自动根据你使用的编译器添加对应的标准编译选项(比如GCC用-std=c++11,MSVC用/std:c++11)CMAKE_CXX_STANDARD_REQUIRED=ON会强制CMake在编译器不支持C11时直接报错,符合你“应用程序需要C11特性”的需求- 这个方法不会覆盖CMake自动推断的
CMAKE_CXX_FLAGS原有内容,只是追加必要的标准支持选项,完美保留默认的优化、调试等flags
2. 手动追加flag到CMAKE_CXX_FLAGS(适用于特殊场景)
如果你确实需要手动指定编译flag(比如除了C++11还有其他自定义flags要追加),可以通过以下方式在命令行实现不覆盖原有值:
cmake -DCMAKE_CXX_FLAGS="$CMAKE_CXX_FLAGS -std=c++11" ../source_dir
不过这里有个小注意点:如果是第一次运行CMake,或者你的shell环境中没有预先设置CMAKE_CXX_FLAGS环境变量,$CMAKE_CXX_FLAGS会被解析为空,这时候就会直接设置成-std=c++11,覆盖CMake的默认flags。
如果想确保保留CMake的默认CMAKE_CXX_FLAGS初始值,可以先获取默认值再追加:
# 在bash/zsh中执行 DEFAULT_FLAGS=$(cmake -N -LA ../source_dir | grep -oP 'CMAKE_CXX_FLAGS:STRING=\K.*') cmake -DCMAKE_CXX_FLAGS="${DEFAULT_FLAGS} -std=c++11" ../source_dir
这个命令先通过cmake -N -LA获取CMake自动推断的默认flags,再手动追加-std=c++11,完全避免覆盖原有内容。
为什么不直接覆盖CMAKE_CXX_FLAGS?
你之前尝试的cmake -DCMAKE_CXX_FLAGS='-std=c++11' ../source_dir会直接替换掉CMake自动生成的默认flags(比如-O2、-DNDEBUG这类优化选项),这显然不是你想要的——上面的方案都能避免这个问题,同时满足需求。
内容的提问来源于stack exchange,提问作者Robert Manson-Sawko
相关产品推荐
相关产品推荐

