【问题标题】:Conditional CXX_FLAGS using cmake based on compiler?使用基于编译器的 cmake 条件 CXX_FLAGS?
【发布时间】:2011-01-13 17:28:07
【问题描述】:

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

假设我试图让一个 C++ 程序在多个编译器(在本例中为 g++、cl 和 bcc32)下编译。我对每个编译器都有不同的命令行开关,我试图做的是基本上创建一个 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++ 标志),则该行有效。

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

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    根据您使用的编译器,有很多 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 ()
    

    【讨论】:

    • 注意,CMAKE_COMPILER_IS_GNUCXX 仅适用于 g++。 OP 要求使用 C++,对,但很高兴知道还有 CMAKE_COMPILER_IS_GNUCC 以避免混淆。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 2017-09-10
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多