CMake:如何为头文件设置COMPILE_FLAGS?

时间:2018-01-09 06:33:55

标签: compilation cmake flags

我已成功使用CMake构建了一个共享库,但其大小并不是那么好。 我已经尝试了几个编译标志来削减大小等。

set_source_files_properties(${TARGET_SOURCE_FILES} PROPERTIES COMPILE_FLAGS "-fexceptions")

上面的代码用于打开单个文件的异常处理,同时将-fno-exceptions添加到CMAKE_CXX_FLAG。它工作正常。

但是,我将相同的代码用于* .hpp以打开rtti,而将-fno-rtti添加到CMAKE_CXX_FLAGS。不幸的是,它没有用。

那么,有没有办法将COMPILE_FLAGS添加到CMAKE中的头文件?我在官方网站上观看过纪录片,但仍然没有线索。

1 个答案:

答案 0 :(得分:4)

这是不可能的,首先可能是一个值得怀疑的事情。

在同一个二进制文件中混合使用不同的编译标志是一个危险的游戏。通常你会希望目标中的所有编译单元共享相同的编译标志,因为它很容易巧妙地搞乱,但非常糟糕。但是,如果您确实知道自己在做什么,CMake仍然允许您像执行此操作一样使用源文件属性。

虽然有了头文件,但情况更糟。标题不是自己编译的,所以你要求的是所有引入该标题的源文件都将继承与该标题相关的特殊编译选项。但由于对编译器的所有调用都是基于源文件发生的,因此需要在每次源更改时重新运行CMake,检查所有源文件中的所有包含,并相应地调整编译器选项。希望您现在可以看到CMake为什么不想这样做。

您可以做的是按每个目标指定这些选项。将标头移动到接口目标并在那里添加相应的接口属性。然后,所有想要使用标头的目标都必须将该目标作为依赖项拉入。因此,所有依赖源文件都将获得特殊的编译标志,无论它们是否确实包含标头,但这只是构建系统的工作原理:

add_library(my_headers INTERFACE)
target_include_directories(my_headers INTERFACE ${PATH_TO_HEADERS})
target_compile_options(my_headers INTERFACE $<$<CXX_COMPILER_ID:GNU>:-fexceptions>)

add_executable(client a.cpp)
target_link_libraries(client PUBLIC my_headers)

在此示例中,a.cpp(以及client的所有其他来源)现在将使用-fexceptions标记进行编译。