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

标签 c++ cmake

我刚刚开始在一些个人和学校项目中使用 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++ 标志),则该行有效。

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

最佳答案

有一堆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 ()

关于c++ - 使用基于编译器的 cmake 条件 CXX_FLAGS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2210839/

相关文章:

cmake - 强制cmake FIND_LIBRARY在自定义目录中查找

c++ - 在 Mac OS-X 上编译 C++ 程序时出现 "framework not found"

C++/CLR DataSourceUpdateMode::OnPropertyChanged with TextBox 将光标向左移动

c++ - 交换 const char* 和 std::string

c++ - 如果我在派生类中具有相同的函数原型(prototype),会发生什么情况?

c++ - configure_file 文件列表 -> #includes cmake

cmake - 如何使用 cmake 将参数传递给 ranlib?

python - 使用pip_pypy3安装pyarrow时出现 "Could NOT find Arrow"错误

c++ - 在多个显示器上使用 GLX RHEL -- OpenGL、XLib 和多个显示器(带线程)

c++ - 为什么这不起作用? libcurl 和 C++