C++ CMake:在项目范围内传播编译选项
假设我想用C++ CMake:在项目范围内传播编译选项,c++,cmake,C++,Cmake,假设我想用/W4为一个有三个lib/targets的项目编译所有代码 A->B->C 在整个项目中应用flag的最佳实践是什么 我可以想出两种方法: 在C的CMake(整个项目的核心库)中设置TARGET\u COMPILE\u选项(C PUBLIC“\W4”),依赖于C的所有其他库将通过以下方式继承该标志:TARGET\u LINK\u LIBRARIES(bc) Pro:新库将自动继承该标志。 缺点:项目的编译标志是隐式的 分别为每个目标/库指定编译选项。 Pro:为每个库分别明确指定和管理
/W4
为一个有三个lib/target
s的项目编译所有代码
A->B->C
在整个项目中应用flag的最佳实践是什么
我可以想出两种方法:
C
的CMake(整个项目的核心库)中设置TARGET\u COMPILE\u选项(C PUBLIC“\W4”)
,依赖于C
的所有其他库将通过以下方式继承该标志:TARGET\u LINK\u LIBRARIES(bc)
Pro:新库将自动继承该标志。
缺点:项目的编译标志是隐式的
Pro:为每个库分别明确指定和管理标志。
缺点:需要(不要忘记)为新库设置标志
第三个选项,更改编译器标志 例如,当我想在整个项目上激活地址消毒剂时,我会:
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)
TARGET\u LINK\u LIBRARIES
真的传播带有TARGET\u COMPILE\u options
的选项集吗?@VTT它传播所有公共的东西和接口(我认为),包括目录,但不知道编译器标志。。。对我来说似乎很脆弱。我以为它是另一种方式。A需要某个选项,而另一个不需要。您必须将A的选项传播到B和C才能链接。但这与现代CMake方法相矛盾,后者通过target
s和properties
Yes和no来构造所有内容。您始终可以为编译器标志指定全局属性,而不是每个目标。我会查新的等价物。我同意在可能的情况下使用新的样式。添加了新的策略add\u compile\u options
仍然在目录而不是目标级别上运行,基本上它只是在标志上调用单独的SET
s的更简洁的语法。是的,我同意,仍然在目录而不是目标上工作。但在这种情况下,对于全局设置,您不希望设置目标,而是全局设置。它不直接修改标志并处理生成器,所以我认为这是与设置变量相比的现代方法(另请参见)。