【问题标题】:Add C++0x support in CMake在 CMake 中添加 C++0x 支持
【发布时间】:2012-09-24 18:22:13
【问题描述】:

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

【问题讨论】:

  • 如果您使用较新的编译器,您应该使用-std=c++11。它不再是草稿。

标签: c++ c++11 cmake


【解决方案1】:

您需要将标志添加到CMAKE_CXX_FLAGS

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

【讨论】:

    【解决方案2】:

    我用这个sn-p for 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()
    

    【讨论】:

      【解决方案3】:

      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 变量,那么会报错 制作。如果使用该功能需要额外的编译器标志, 如-std=gnu++11,会自动添加flag。

      可以使用此宏测试的功能列表(希望是完整的)是here

      【讨论】:

        【解决方案4】:

        我有以下模块:

        $ 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,如果我没记错的话。

        【讨论】:

          猜你喜欢
          • 2011-06-09
          • 2011-02-09
          • 1970-01-01
          • 1970-01-01
          • 2011-03-16
          • 2014-11-05
          • 1970-01-01
          • 2010-10-14
          • 1970-01-01
          相关资源
          最近更新 更多