1

我想将 C++98 / C++11 开关添加到基于 cmake 的构建系统中。由于某些跨平台相关的原因,它已经有另一个开关,即:

if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++98")
else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98")
endif()

因此,要添加 C++11,我必须添加一个类似的子句,但由于代码重复,我不喜欢它。真的不可能独立于标准启用扩展吗?就像是:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=${STANDARD_FLAG} ${EXTENSION_FLAGS}")
4

2 回答 2

4

你可以这样做:

if(USE_CXX_11)
  set(CXX_VERSION 11)
else()
  set(CXX_VERSION 98)
endif()

if(USE_GNU_EXTENSIONS)
  set(CXX_DIALECT gnu)
else()
  set(CXX_DIALECT c)
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=${CXX_DIALECT}++${CXX_VERSION}")
于 2013-09-13T13:37:25.663 回答
1

为什么不简单地使用CheckCXXCompilerFlag 模块

可以用作

include(CheckCXXCompilerFlag)

check_cxx_compiler_flag(-std=gnu++11  HAS_FLAG_STD_GNUCXX11)

if(NOT HAS_FLAG_STD_GNUCXX11)
    check_cxx_compiler_flag(-std=c++11    HAS_FLAG_STD_CXX11)
endif()

if(HAS_FLAG_STD_GNUCXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
endif()

if(HAS_FLAG_STD_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
于 2013-09-13T13:40:18.280 回答