正确使用' decltype(自动)'以及如何使用Cmake更改-std

时间:2015-10-15 20:10:55

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

我正在使用两个库:

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

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

编译时
  

对于带

的行
  

decltype(自动)......

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

  

错误:在' auto'

之前预期的primary-expression      

错误:在'decltype'之前预期的不合格ID

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

我假设您编译了两个库,然后编译了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?