我想写一个CMakeFiles.txt(从来没有做过它),我不知道什么编译器标志用于C + + 11。我使用GCC 4.8.2和标志是std = C++ 0x,但我不知道该如何处理其他编译器。我不认为他们都使用该标志,我相信MinGW-TDM使用std = C++ 11,那么确保编译器使用C++ 11的正确方法是什么?C++编译器标志11
回答
在我的项目中,我只是尝试添加-std = C++ 11,如果不起作用,我尝试-std = C++ 0x。当两者都失败时,我就把它放在一边。对我来说,这很好,但我从来没有尝试过Windows编译器。 下面的示例代码:
# test for C++11 flags
include(TestCXXAcceptsFlag)
if(NOT DISABLE_GXX0XCHECK)
# try to use compiler flag -std=c++11
check_cxx_accepts_flag("-std=c++11" CXX_FLAG_CXX11)
endif(NOT DISABLE_GXX0XCHECK)
if(CXX_FLAG_CXX11)
[add flag -std=c++11 where needed]
else()
if(NOT DISABLE_GXX0XCHECK)
# try to use compiler flag -std=c++0x for older compilers
check_cxx_accepts_flag("-std=c++0x" CXX_FLAG_CXX0X)
endif(NOT DISABLE_GXX0XCHECK)
if(CXX_FLAG_CXX0X)
[add flag -std=c++11 where needed]
...
Mabye stackoverflow.com/q/10984442确实有助于你。 ErikSjölund建议看看CMake每晚构建的FindCXXFeatures.cmake。
编辑︰我试过这与微软的Visual C++和我的解决方案有一个缺陷:编译器发出关于无法识别的标志的警告。这意味着CMake检测到标志正确并添加它。因此,每个可执行文件都会收到此警告。添加-Werror或Visual C++的标志应该有所帮助。
您需要手动设置你的标志为您指定的每个编译:
IF (CMAKE_COMPILER_IS_GNUCXX)
SET (CMAKE_CXX_FLAGS "-std=gnu++11")
ELSEIF (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
SET (CMAKE_CXX_FLAGS "-std=c++11")
ELSEIF (MSVC)
# On by default
ENDIF()
这样的实例。
对于clang,你可能还需要'-stdlib = libC++' – 2013-12-16 17:29:08
随着即将推出的CMake版本3.1.0(现在可作为发布候选版本2),新方法是使用CMake命令target_compile_features来指定使用什么C++ features。 CMake将根据这些信息确保使用正确的命令行标志调用C++编译器(例如-std = C++ 11)。
例如,该C++的文件名的程序main.cc利用的C++特性: cxx_strong_enums,cxx_constexpr,cxx_auto_type
#include <cstdlib>
int main(int argc, char *argv[]) {
enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
constexpr float a = 3.1415f;
auto b = a;
return EXIT_SUCCESS;
}
此的CMakeLists.txt文件将打造它
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)
set(needed_features
cxx_strong_enums
cxx_constexpr
cxx_auto_type)
target_compile_features(foobar PRIVATE ${needed_features})
作为今天(2014年11月21日)CMake版本3.1.0尚未发布。它现在可作为发布候选版本2使用。 请注意,此功能尚未发布到稳定的CMake版本中,所以我想,只有在您喜欢试验的情况下才能使用此功能。
set_property(TARGET your_target PROPERTY CXX_STANDARD 11)
- 1. Objective-C编译器标志
- 2. C++编译器标志11 - 没有找到计时文件
- 3. C++编译器g ++ 11
- 4. g ++等效的编译器标志到VC++编译器标志
- 5. C++编译C++ 11
- 6. 什么是“DNS_BLOCK_ASSERTIONS”(C编译器标志)?
- 7. C++ -malign-double编译器标志
- 8. 通过宏定义编译标志(C++ 11和优化)
- 9. 编译器标志在Eclipse
- 10. GCC编译器标志“-DEVAL”
- 11. Cython OpenMP编译器标志
- 12. C++ 11空标志类
- 13. Visual C++编译器2012年11月CTP与Qt Creator for C++ 11
- 14. CMake编译标志
- 15. 编译时标志
- 16. C++ 11 constexpr编译错误
- 17. C++ 11 Makefile不会编译
- 18. 用g ++编译C++ 11
- 19. 编译器gcc编译器标志的文档?
- 20. 使用C++编译wxWidgets 0x标志
- 21. 用优化标志编译C
- 22. C++链接和编译标志
- 23. 编译简单的hello world ZeroMQ C例子,编译标志?
- 24. 编译器无法识别标志
- 25. f2py的附加编译器标志
- 26. 使用编译器标志“-static-libgcc”
- 27. 通过xcodebuild传递编译器标志
- 28. 为Swig设置编译器标志
- 29. Xcode编译器标志列表
- 30. Xcode项目范围编译器标志
GCC 4.8。*的正确标志是'-std = C++ 11'。至于其他编译器,你必须咨询他们的文档 - 没有通用的方法。 – Angew
相关? http://stackoverflow.com/q/10851247/420683 – dyp
嗯我一直在我的makefiles中使用-std = C++ 0x,它一直在工作。我会尝试该线程DyP中的建议,但我想我必须找到msvc和llvm的文档。多谢你们。 – Mike