我刚刚开始使用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")
Run Code Online (Sandbox Code Playgroud)
以及其他编译器的elsifs等等,但这似乎不能正常工作 - 它CXXFLAGS完全放弃了.如果我使文件完全无条件(即,假设g ++并使用g ++标志),该行就可以工作.
我在这里做错了什么,或者有更好的方法来处理这类问题?
Mik*_*kes 22
根据您使用的编译器,有一堆预定义的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 ()
Run Code Online (Sandbox Code Playgroud)
如果希望编译器选项覆盖并保留在生成的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 ()
Run Code Online (Sandbox Code Playgroud)