gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:03:30 32 4
gpt4 key购买 nike

我刚刚开始在一些个人和学校项目中使用 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com