CMake构建时对gcc/g++传参


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


文章作者: sfc9982
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 sfc9982 !
  目录