【问题标题】:How should SSE flags be added with modern CMake?现代 CMake 应该如何添加 SSE 标志?
【发布时间】:2018-06-19 18:51:25
【问题描述】:

我正在尝试至少遵循现代 cmake >= 3.0 的指南,我不假设任何关于编译器的内容并使用基于目标的命令。

见:https://www.youtube.com/watch?v=bsXLMQ6WgIk 或搜索“有效cmake”。

那么,当我的目标依赖于 SSE 4.1 时,我应该如何声明这些信息?

我实际上希望 FindSSE 包含一个没有源但带有它自己的适当链接器标志的接口目标。但它只说明主机上是否存在 SSE 版本。

这因平台而异,例如: /arch:sse4.1 与 -msse4.1

那么我是否遗漏了 cmake 内部为不同编译器处理此设置的东西,还是我只需要检查平台并相应地设置 target_compile_options?

【问题讨论】:

  • 关于第一点:您可以将 FindSSE 设置的变量封装到您自己编写的纯接口目标中。然后,您自己的目标可以链接到此(私有)。更多的是你自己写的,但只要新的指导方针没有被到处接受,你就没有太多的选择。

标签: c++ cmake


【解决方案1】:

根据 lubgr 的回复,我设计了这个:

add_library(sse4_1 INTERFACE IMPORTED)
if(MSVC)
    target_compile_options(sse4_1 INTERFACE /arch:SSE4.1)
else()
    target_compile_options(sse4_1 INTERFACE -msse4.1)
endif()

【讨论】:

  • 看起来不错,而且由于它反复出现,拥有我可以注入的目标似乎很方便。这肯定比必须对每个目标都执行 if/else 更好。不过,每当我必须在 cmake 中输入编译器特定的标志时,我仍然觉得有点奇怪。也许 SIMD 设置最终会进入编译功能。
【解决方案2】:

对于项目中所有目标使用的全局标志,仍然使用基于非目标的方法是完全可以的,例如。致电add_compile_options

出于可维护性的原因,您应该只在一个地方执行此操作,最好靠近根 CMakeLists.txt

这使您不必在整个项目中到处重复相同的目标依赖项。请注意,这在某种程度上依赖于程序员的纪律:一旦您有需要不同标志的单一目标,或者您开始​​引入多个设置全局标志的位置,这很快就会变成维护的噩梦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 2014-08-23
    • 2016-07-15
    • 1970-01-01
    相关资源
    最近更新 更多