我在cmake中配置了一个相当大的应用程序。我最近添加了几个利用C++ 0x功能的类,并且它打破了构建,因为cmake未配置为使用C++ 0x支持进行编译。我如何将它添加为cmake的选项?在cmake中添加C++ 0x支持
11
A
回答
9
您需要将标志添加到CMAKE_CXX_FLAGS
:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
7
我用这个片段的GCC,但它是一个更复杂的方式
if(CMAKE_COMPILER_IS_GNUCXX)
SET(ENABLE_CXX11 "-std=c++11")
EXECUTE_PROCESS(COMMAND "${CMAKE_CXX_COMPILER} -dumpversion" OUTPUT_VARIABLE GCC_VERSION)
if (GCC_VERSION VERSION_LESS 4.7)
SET(ENABLE_CXX11 "-std=c++0x")
endif()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ENABLE_CXX11}")
endif()
0
我有以下模块:
$ cat FindCXX11.cmake
# - Finds if the compiler has C++11 support
# This module can be used to detect compiler flags for using C++11, and checks
# a small subset of the language.
#
# The following variables are set:
# CXX11_FLAGS - flags to add to the CXX compiler for C++11 support
# CXX11_FOUND - true if the compiler supports C++11
#
# TODO: When compilers starts implementing the whole C++11, check the full set
include(CheckCXXSourceCompiles)
include(FindPackageHandleStandardArgs)
set(CXX11_FLAG_CANDIDATES
#Gnu and Intel Linux
"-std=c++0x"
#Microsoft Visual Studio, and everything that automatically accepts C++11
" "
#Intel windows
"/Qstd=c++0x"
)
set(CXX11_TEST_SOURCE
"
class Matrix
{
public:
Matrix(int a, int b, int c, int d)
: data {a, b, c, d}
{}
private:
int data[4];
};
int main()
{
int n[] {4,7,6,1,2};
for (auto i : n)
Matrix mat (3,5,1,2);
return 0;
}
")
foreach(FLAG ${CXX11_FLAG_CANDIDATES})
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_FLAGS "${FLAG}")
unset(CXX11_FLAG_DETECTED CACHE)
message(STATUS "Try C++11 flag = [${FLAG}]")
check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED)
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
if(CXX11_FLAG_DETECTED)
set(CXX11_FLAGS_INTERNAL "${FLAG}")
break()
endif(CXX11_FLAG_DETECTED)
endforeach(FLAG ${CXX11_FLAG_CANDIDATES})
set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}")
find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS)
mark_as_advanced(CXX11_FLAGS)
我用它来检查我使用的C++ 11的子集(实际上这是多余的,因为我是你更多地唱歌),由编译器支持。进一步构建它并添加更多功能并添加其他编译器开关很容易。实际上我迄今为止唯一通过这个测试的编译器,如果我没有记错的话,gcc> = 4.6和clang> = 3.1。
0
如this answer所示,最好使用target_compile_features
来要求支持所需的特定功能。
这说明/文档更好的代码,需要什么功能,是跨平台兼容,并将带给用户更实用的错误消息,如果需要的要素是不是在自己的编译器可用。
从manual page此选项:
target_compile_features
添加预计编译器功能的目标。
target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...])
指定编译给定目标时所需的编译器功能。如果 特征没有在CMAKE_C_COMPILE_FEATURES变量或 CMAKE_CXX_COMPILE_FEATURES变量,那么错误将被 CMake的报告列出。如果使用该功能需要一个额外的编译标志, 如
-std=gnu++11
,该标志将被自动添加。
可以用此宏测试的功能列表(希望完整)是here。
相关问题
- 1. 如何添加FASM支持到CMake
- 2. CMake铿锵和C++ 0x
- 3. Qt支持C++ 0x枚举类
- 4. C++ 0x GCC支持iPhone的Lambda
- 5. VS2008有一些C++ 0x的支持吗?
- 6. 支持C++的最低iOS版本0x
- 7. VS2005 C++ 0X不完全支持
- 8. Eclipse中的Cmake支持
- 9. 什么是Windows C++ IDE支持新的C++ 0X标准?
- 10. 在c#中添加对动态文件加载器的支持
- 11. 在Xcode 4.2项目中使用C++ 0x通过CMake
- 12. CMAKE是否支持Python 3?
- 13. CMake支持“make uninstall”吗?
- 14. 如何在Cocos2d中添加iPhone6支持
- 15. 在Netty中添加对LLRP的支持
- 16. 如何在javafx中添加controldecoartion支持?
- 17. Netbeans(7.3)在PHP中添加HTML5支持
- 18. 如何在JEditorPane中添加Flash支持
- 19. 如何在iPhone中添加GPS支持?
- 20. 如何在PHP中添加UTF8支持?
- 21. C++ 0X memory_order无栅栏,应用程序,支持的芯片
- 22. arm-linux-gnueabihf-g ++是否具有可靠的C++ 0x支持
- 23. 支持多线程程序的C++ 0X标准
- 24. gcc 4.5.1 C++ 0x线程支持的配置选项
- 25. 编译器支持即将推出的C++ 0x
- 26. C++ 0x officialy发布了吗?主要编译器支持它吗?
- 27. C++ 0x是否支持匿名内部类?
- 28. 在C++中增加lambda :: _ 1 0x
- 29. WP7:在C#中添加支持的文化
- 30. 如何在Visual Studio中启用C++ 0x功能? [初始化列表支持]
如果您正在使用新的编译器,你应该使用'-std = C++ 11'代替。它不再是草稿。 –