Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake:在项目范围内传播编译选项_C++_Cmake - Fatal编程技术网

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的更简洁的语法。是的,我同意,仍然在目录而不是目标上工作。但在这种情况下,对于全局设置,您不希望设置目标,而是全局设置。它不直接修改标志并处理生成器,所以我认为这是与设置变量相比的现代方法(另请参见)。