CMake:在整个项目范围内传播编译选项

时间:2018-12-14 09:48:14

标签: c++ cmake

让我们说我想用/W4编译具有三个库/ target的项目的所有代码。

A -> B -> C

在整个项目中应用该标志的最佳做法是什么?

我可以想到两种方法:

  1. TARGET_COMPILE_OPTIONS(C PUBLIC "\W4")的CMake中设置C(这是整个项目的核心库),所有依赖于C的其他库都将通过以下方式继承标志: TARGET_LINK_LIBRARIES(B C)
    Pro:新库将自动继承该标志。
    Con:项目的编译标志是隐式的。

  2. 分别为每个目标/库指定编译选项。
    Pro:标志已为每个库明确指定并可以单独管理。
    Con:需要为新库设置(不要忘记)标志。

1 个答案:

答案 0 :(得分:1)

第三个选项,更改编译器标志。

例如,当我想在整个项目上激活地址清理器时,我会这样做:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address -static-libasan")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address -static-libasan")

为当前文件夹和子文件夹设置标志的当前惯用方式是

add_compile_options(-fsanitize=address)