我在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'代替。它不再是草稿。 –