在cmake中添加c ++ 0x支持

时间:2012-10-03 18:57:14

标签: c++ c++11 cmake

我在cmake中配置了相当大的应用程序。我最近添加了几个利用C ++ 0x功能的类,它打破了构建,因为cmake没有配置为使用C ++ 0x支持进行编译。如何将其添加为cmake的选项?

4 个答案:

答案 0 :(得分:10)

您需要将标记添加到CMAKE_CXX_FLAGS

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

答案 1 :(得分: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()

答案 2 :(得分: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如果我没记错的话。

答案 3 :(得分: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