基于编译器使用CMake条件设置CXX_FLAGS?

19

我刚开始在一些个人和学校项目中使用CMake,但遇到了一个小问题。

假设我正在尝试在多个编译器(例如g ++、cl和bcc32)下编译C ++程序。对于每个编译器,我都有不同的命令行开关。我尝试的是基本上创建一个gnu / ms / borland目录,并在其中创建CMake文件夹(例如,在gnudirectory中进入目录并执行cmake -DCMAKE_CXX_COMPILER=g++)。

在顶层目录的CMakeLists.txt中,我尝试进行以下操作:

if(CMAKE_CXX_COMPILER STREQUAL g++)

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

对于其他编译器也是同样的处理方式,但似乎这样做不正确 - 它完全删除了CXXFLAGS。如果我让文件完全无条件(即假设使用g++并使用g++标志),则该行有效。

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

1个回答

23

根据你所使用的编译器,有一堆预定义的CMake变量

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 ()

5
注意,CMAKE_COMPILER_IS_GNUCXX 仅适用于 g++。 OP 请求的是 C++,但知道也有 CMAKE_COMPILER_IS_GNUCC 可以避免混淆。 - mloskot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接