【问题标题】:How to define transitive CXX_STANDARD C++11 in Cmake如何在 Cmake 中定义传递 CXX_STANDARD C++11
【发布时间】:2015-04-16 22:54:50
【问题描述】:

我有一个只有头文件的 C++11 库,所以我想配置它,使用 CMake > 3.1,编译功能似乎是合理的做法:

target_compile_features(my_header_lib INTERFACE cxx_range_for)

但我宁愿不必指明单个特性,而只需指明 C++11 或 C++14。然后我可以尝试使用以下内容:

set_property(TARGET my_target PROPERTY CXX_STANDARD 11)

问题是 my_target 在这里不能是 INTERFACE,它不受支持,而且我不能将它定义为 PUBLIC,因此我的仅标头库的使用者(许多 EXE)将自动从 lib 传播 C++11 配置。

是否有某种方法可以在高级别的 11/14 标准中定义,但也可以为仅标头(接口)库配置它?我不希望回到旧手册 -std=c++11。

【问题讨论】:

  • 确实,不支持INTERFACE_CXX_STANDARD 目标属性是经过深思熟虑的设计选择。另请参阅CMAKE_CXX_STANDARD 变量。

标签: c++ c++11 cmake


【解决方案1】:

CMake 3.8(2017 年 4 月发布)引入了元功能(例如 cxx_std_11cxx_std_14cxx_std_17)。例如,您现在可以编写:

target_compile_features(my_header_lib INTERFACE cxx_std_11)

【讨论】:

    【解决方案2】:

    目前最简单的解决方案是在全局变量中手动维护 C++11 和 C++14 功能列表,并将该列表提供给 target_compile_features

    set(CXX11_FEATURES
        cxx_auto_type
        cxx_constexpr
        [...]
    )
    
    set(CXX14_FEATURES
        cxx_generic_lambdas
        [...]
    )
    
    target_compile_features(my_header_lib INTERFACE ${CXX11_FEATURES} ${CXX14_FEATURES})
    

    可以说,如果 CMake 已经为您提供了这些列表,那就太好了,但目前它没有。

    请注意,这与 CMake 中当前编译功能机制的工作方式是一致的。 CXX_STANDARD 属性确定在命令行上将哪个标志提供给编译器。然而,仅仅因为您请求某个标准版本并不能保证它会正确编译某个功能。确保某个功能存在(如果不存在则失败并出现有意义的错误)的唯一方法是通过target_compile_features 对其进行检查。

    这里的复杂性并不是因为 CMake 处理事情的方式,而是因为不同的编译器实现了不同的标准子集。

    【讨论】:

    • 是的,我认为这是一个好方法。是的,我认为 CMake 为我们定义列表是个好主意。还有一个小问题,是 target_compile_features 似乎没有完全为 MinGW 的编译器实现数据,并且我遇到了一些错误,尽管它似乎在 public.kitware.com/Bug/view.php?id=15443 中得到了解决。如有必要,将尝试此操作并发布另一个问题。
    • @drodri 是的,target_compile_features 现在不是很可靠。 IIRC 目前仅适用于最新版本的 gcc 和 clang。我希望这将很快得到解决,因为总的来说这是 CMake 的一个非常酷的功能。
    • 编译器已知的功能列表在 cmake.org/cmake/help/v3.2/variable/… 中。 GCC 4.4 是受支持的最旧的 GCC 版本,Xcode 4.0 和 MSVC 2010 附带的 Clang 版本。这些都是旧的。说只支持最近的编译器是不正确的。
    • @steveire 很高兴听到。刚查了一下,上次我尝试的是3.1。那时我无法让它与 MSVC 一起正常工作,所以我很高兴听到这个问题现在已经修复。是的,在比您提到的那些更早的编译器中检查 CXX11 支持可能不是很有用。
    • 从 3.2 开始支持的编译器已记录在 master:cmake.org/cmake/help/git-master/manual/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2014-08-15
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多