gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:07:12 27 4
gpt4 key购买 nike

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

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

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

但是,我对 *.hpp 使用相同的代码为其打开 rtti,同时将 -fno-rtti 添加到 CMAKE_CXX_FLAGS。不幸的是,它没有用。

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

最佳答案

这首先是不可能的,而且可能是有问题的。

在同一个二进制文件中混合不同的编译标志是一种危险的游戏。通常你会希望目标中的所有编译单元共享相同的编译标志,因为很容易巧妙地把事情搞砸,但否则会非常糟糕。但是,如果您确实确定自己在做什么,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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com