Doo*_*rag 5 flags compilation cmake
我已成功使用CMake构建了一个共享库,但其大小并不是那么好.我已经尝试了几个编译标志来削减大小等.
set_source_files_properties(${TARGET_SOURCE_FILES} PROPERTIES COMPILE_FLAGS "-fexceptions")
Run Code Online (Sandbox Code Playgroud)
上面的代码用于打开单个文件的异常处理,而-fno-exceptions被添加到CMAKE_CXX_FLAG.它工作正常.
但是,我将相同的代码用于*.hpp以打开rtti,而将-fno-rtti添加到CMAKE_CXX_FLAGS.不幸的是,它没有用.
那么,有没有办法将COMPILE_FLAGS添加到CMAKE中的头文件?我在官方网站上观看过纪录片,但仍然没有线索.
这首先是不可能的,而且可能是一个值得怀疑的事情。
在同一个二进制文件中混合不同的编译标志是一个危险的游戏。通常,您希望目标中的所有编译单元共享相同的编译标志,因为很容易将事情巧妙地搞砸,但否则非常糟糕。但是,如果您真的确定自己在做什么,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)
Run Code Online (Sandbox Code Playgroud)
在此示例中,a.cpp(以及 的所有其他来源client)现在将使用-fexceptions标志进行编译。