CMake构建时对 gcc/g++ 传参
前情提要
一般情况下,我们可以使用 cmake
命令传递编译器选项
set(CMAKE_CXX_FLAGS "-Wall -std=c++23")
但例如 cmake -Wl,-rpath=/home/abcd/newlibs/ path/to/CMakeLists.txt
的命令行传参将会覆盖掉 CMakeList.txt 中的设置。
附加编译器标志
CMAKE_CXX_FLAGS
变量的初始内容是 CMake 自身在 OS/工具链检测期间被设置的内容,以及继承了环境变量CMAKE_CXX_FLAGS_INIT
中的内容。
所以可以这样调用:
cmake -E env CXXFLAGS="-Wall" cmake ..
在此之后,CMake
会期望用户修改 CMAKE_CXX_FLAGS 变量以附加参数,例如通过使用像ccmake
这样的编辑器。
可以引入自己的构建类型,例如 ALL_WARNINGS. 构建参数中附加了构建类型的部分:
cmake -DCMAKE_CXX_FLAGS_ALL_WARNINGS:STRING="-Wall" -DCMAKE_BUILD_TYPE=ALL_WARNINGS ..
cmake -DCMAKE_C_FLAGS="-DDEFINED_IN_CLI" ..
附加链接器标志
链接器选项和编译器选项非常相近。只是 CMake 的变量名称取决于目标类型(EXE或SHARED)MODULE。
CMAKE_EXE_LINKER_FLAGS_INIT
, CMAKE_SHARED_LINKER_FLAGS_INIT
, CMAKE_MODULE_LINKER_FLAGS_INIT
合并后构成了LDFLAGS
并继承给了CMAKE_EXE_LINKER_FLAGS
, CMAKE_SHARED_LINKER_FLAGS
, CMAKE_MODULE_LINKER_FLAGS
.
因此,我们可以这样使用:
cmake -E env LDFLAGS="-rpath=/home/abcd/libs/" cmake ..
命令附加了构建类型的部分:
cmake -DCMAKE_SHARED_LINKER_FLAGS_MY_RPATH:STRING="-rpath=/home/abcd/libs/" -DCMAKE_BUILD_TYPE=MY_RPATH ..
备选方案
CMake 确实提供了特殊变量来以独立于平台的方式设置编译器/链接器标志。所以不需要知道具体的编译器/链接器选项。
例如:
CMAKE_CXX_STANDARD
CMAKE_POSITION_INDEPENDENT_CODE
CMAKE_BUILD_RPATH
CMAKE_INSTALL_RPATH_USE_LINK_PATH
不幸的是,编译器的警告等级还尚未支持
举例
cmake -DCMAKE_CXX_FLAGS="$(CMAKE_CXX_FLAGS) -DYOUR_CUSTOM_DEFINE=1" <其余命令>
https://stackoverflow.com/questions/44284275/passing-compiler-options-cmake