target_compile_options() 仅适用于 C++ 文件?
Posted
技术标签:
【中文标题】target_compile_options() 仅适用于 C++ 文件?【英文标题】:target_compile_options() for only C++ files? 【发布时间】:2016-07-25 23:17:33 【问题描述】:是否可以将target_compile_options()
仅用于 C++ 文件?我想将它用于作为其他应用程序依赖项的目标,以便库可以将其编译器标志传播到这些应用程序。但是,如果与 C 或 ObjC 文件一起使用,某些标志(例如 -std=c++14
)会导致构建失败。
我已经读到我应该 CXX_FLAGS
而不是只将这些标志添加到 C++ 文件中,但这不会(自动)通过 cmake 的包系统传播。
【问题讨论】:
IIRCCXX_FLAGS
可以通过库包由prefixing with that packages name 传播。
你说的CMake的包系统是什么意思?
【参考方案1】:
解决方案
您可以使用generator expressions:
target_compile_options(MyLib PUBLIC $<$<COMPILE_LANGUAGE:CXX>:-std=c++14>)
替代方案
但在这种特殊情况下,更独立于平台的方法是使用target_compile_features()
。我不确定您使用的是哪个compiler feature,因此以下仅为示例:
target_compile_features(MyLib PUBLIC cxx_explicit_conversions)
【讨论】:
太好了,生成器表达式正是我所需要的,谢谢。 target_compile_features 确实看起来不错,尽管由于一些发行版,我们现在需要坚持使用 cmake v3.0。 target_compile_features 显然可用于直接按年份要求特定语言版本,而无需挑选该版本引入的特定功能:target_compile_features(someTargetName PUBLIC cxx_std_14) 请不要通过操纵编译器选项来设置 C++ 标准。由于 cmake 3.1 cmake 允许用户通过将CXX_STANDARD
属性设置为 11 来通过目标属性设置预期的编译器标准。
对我来说,在 CMake 3.12 上,这仅在 enable_language(CUDA)
出现在序言中时才有效。【参考方案2】:
我读过我应该 CXX_FLAGS 而不是只将这些标志添加到 C++ 文件中,但这不会(自动)通过 cmake 的包系统传播。
在 CMake 中,如果您使用任何以 target_*
为前缀的函数,则它仅具有一个构建目标的范围。如果您希望您的整个项目使用给定的标准构建,您可以使用set(CMAKE_CXX_STANDARD 14)
。如果某些目标需要其他设置,您可以使用target
前缀函数和CXX_STANDARD
变量在本地覆盖它(默认值为$CMAKE_CXX_STANDARD
)。
正如RAM 所指出的,此选项自 v3.1 起可用。但是从https://repology.org/project/cmake/versions来看,它已经得到了广泛的支持。
还经常有人指出,您不应该将 cpp 版本设置为固定。我还没有对此发表意见,但你可以,但你可以使用关键字 CACHED 使其可覆盖。
【讨论】:
以上是关于target_compile_options() 仅适用于 C++ 文件?的主要内容,如果未能解决你的问题,请参考以下文章
CMake:使用 target_compile_options 设置 ggc-min-expand 和 -heapsize
将 CMAKE_CXX_FLAGS 传递给 target_compile_options
CMake:使用target_compile_options设置ggc-min-expand和-heapsize
CMake中add_compile_options/target_compile_options的使用