作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经成功使用 CMake 构建了一个共享库,但是大小不太好。
我已经尝试了几个编译标志来减少大小等。
set_source_files_properties(${TARGET_SOURCE_FILES} PROPERTIES COMPILE_FLAGS "-fexceptions")
最佳答案
这首先是不可能的,而且可能是有问题的。
在同一个二进制文件中混合不同的编译标志是一种危险的游戏。通常你会希望目标中的所有编译单元共享相同的编译标志,因为很容易巧妙地把事情搞砸,但否则会非常糟糕。但是,如果您确实确定自己在做什么,CMake 仍然允许您像执行此操作那样使用源文件属性。
但是,使用头文件时,情况会更糟。 header 不会自行编译,因此您要求的是所有拉入该 header 的源文件都将继承与该 header 关联的特殊编译选项。但是由于对编译器的所有调用都是基于源文件发生的,这将需要在每次源更改时重新运行 CMake,检查所有源文件中的所有包含,并相应地调整编译器选项。希望您现在可以明白为什么 CMake 不想这样做。
您可以做的是基于每个目标指定这些选项。将标题移动到接口(interface)目标并在那里添加相应的接口(interface)属性。然后,所有想要使用 header 的目标都必须将该目标作为依赖项引入。因此,所有依赖的源文件都将获得特殊的编译标志,无论它们是否确实包含头文件,但这正是构建系统的工作方式:
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
进行编译旗帜。
关于compilation - CMake:如何为头文件设置 COMPILE_FLAGS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48162570/
我是一名优秀的程序员,十分优秀!