条件CXX_FLAGS使用基于编译器的cmake?

时间:2010-02-05 22:17:10

标签: c++ cmake

我刚刚开始在一些个人和学校项目中使用CMake,而且我被一个小问题困扰了。

假设我正在尝试在多个编译器(在这种情况下为g ++,cl和bcc32)下编译C ++程序。我为每个编译器配备了不同的命令行开关,我试图做的是基本上创建一个gnu / ms / borland目录并在那里创建CMake(通过输入目录并执行cmake -DCMAKE_CXX_COMPILER=g++ ..在gnu,目录中,例如)。

在顶级目录的CMakeLists.txt中,我尝试了以下几点:

if(CMAKE_CXX_COMPILER STREQUAL g++)

  set(CMAKE_CXX_FLAGS "-Wextra -Wall -ansi -pedantic")

对于其他编译器使用elsifs,但这似乎无法正常工作 - 它完全丢弃了CXXFLAGS。如果我使文件完全无条件(即假设g ++并使用g ++标志),该行就可以工作。)

我在这里做错了什么,或者有更好的方法来处理这类问题?

1 个答案:

答案 0 :(得分:22)

根据您正在使用的编译器,有一堆pre-defined CMake variables

if (MSVC)
  set ( CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE")
  set ( CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGSS_GO_HERE")
  set ( CMAKE_CXX_FLAGS_RELEASE  "/RELEASE_FLAGS_GO_HERE" )
endif ()

if (BORLAND)
  set ( CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE")
  set ( CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGS_GO_HERE")
  set ( CMAKE_CXX_FLAGS_RELEASE  "/RELEASE_FLAGS_GO_HERE" )
endif ()

if (CMAKE_COMPILER_IS_GNUCXX)
  set ( CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE")
  set ( CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGS_GO_HERE")
  set ( CMAKE_CXX_FLAGS_RELEASE  "/RELEASE_FLAGS_GO_HERE" )
endif ()

如果希望编译器选项覆盖并保留在生成的CMakeCache中:

if (CMAKE_COMPILER_IS_GNUCXX)

  set ( CMAKE_CXX_FLAGS "/GLOBAL_FLAGS_GO_HERE" 
        CACHE STRING "g++ Compiler Flags for All Builds" FORCE)

  set ( CMAKE_CXX_FLAGS_DEBUG "/DEBUG_FLAGS_GO_HERE"
        CACHE STRING "g++ Compiler Flags for Debug Builds" FORCE)

  set ( CMAKE_CXX_FLAGS_RELEASE  "/RELEASE_FLAGS_GO_HERE"
        CACHE STRING "g++ Compiler Flags for Release Builds" FORCE)

endif ()