【问题标题】:Proper -std with 'decltype(auto)' and how to change -std with Cmake使用 'decltype(auto)' 的正确 -std 以及如何使用 Cmake 更改 -std
【发布时间】:2015-10-15 20:10:54
【问题描述】:

我正在使用两个库:

  • 第一个使用 -std=c++11
  • 第二个使用 -std=c++1y

现在,我在第一个库中创建了一个测试用例(因为这里更简单),其中我使用了两个库的头文件。当我编译使用

制作

对于带有

的行

decltype (auto) ...

我收到以下两条错误消息:

错误:“auto”之前的预期主表达式

错误:'decltype' 之前的预期 unqualified-id

这些行来自第二个库的一些 .cpp 文件,当我编译第二个库的示例(在其中定义)时,这些错误不会出现。所以我认为解决方案是将第一个库的 -std=c++11 更改为 -std=c++1y 因为这是两个库之间标志的唯一区别。

假设我的想法可能是正确的……很明显,在第一个库中,源目录中有很多 CMake 文件,我有点害怕在一切都不起作用之前更改配置。而且我没有安装库,有人为我安装了它。通常我在哪里可以找到 CXX_FLAGS 变量?在添加 -std=c++14 之后,我应该重新安装库还是在编译测试用例的地方“制作”就足够了?

我知道可能缺少许多信息,但这是我第一次使用复杂的库处理 CMake。

【问题讨论】:

  • decltype(auto) 是 C++14 的一部分,而不是 C++11。因此,在使用 -std=c++11 进行编译时,您会得到正确的错误。

标签: c++ c++11 cmake makefile c++14


【解决方案1】:

假设您的库已经编译,您需要为您的测试项目启用 c++14 功能。执行此操作的简单方法是使用cmake-gui(或通过命令行ccmake)将-std=c++1y-std=c++14(取决于您的编译器)添加到CMAKE_CXX_FLAGS 变量中。

不过,更好的方法是使用 cmake 的 target_compile_features 命令(有关文档,请参阅 here)。它允许您定义要在代码中使用的功能,并且 CMake 会相应地设置编译器标志。因此,在您的情况下,在您的CMakeLists.txt 文件中添加target_compile_features(mylib cxx_decltype_auto) 命令(其中mylib 是您使用add_libraryadd_executable 添加的目标的名称)。

【讨论】:

    【解决方案2】:

    我假设你编译了这两个库,然后是你的 exe

    add_library(libA ...)
    target_compile_features(libA
        PUBLIC
            # Or whatever the features that the headers of this one needs
            cxx_variadic_templates
    )
    
    add_library(libB ...)
    target_compile_features(libB
        PUBLIC cxx_decltype_auto
    )
    
    add_executable(myexe ...)
    # CMake will compute the correct flag to use.
    target_link_libraries(myexe libA libB)
    

    https://cmake.org/cmake/help/v3.3/manual/cmake-compile-features.7.html

    见:What INTERFACE, PUBLIC, PRIVATE mean in cmake target compilation setting?

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2020-04-24
      • 2013-01-12
      • 2013-08-10
      • 2013-01-28
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多