Cmake创建Makefile支持使用不同配置进行调试和发布

Cmake创建Makefile支持使用不同配置进行调试和发布,cmake,Cmake,是否可以使用cMake为调试和发布模式生成一个不同配置的makefile? 例如,不同的CXX选项或安装可执行文件的不同路径 这是一个基本的cMakeList.txt,它为发布和调试模式创建一个makefile cmake_minimum_required(VERSION 3.10) # set the project name project(Tutorial) # add the executable add_executable(Tutorial main.cpp) set(CMAKE

是否可以使用cMake为调试和发布模式生成一个不同配置的makefile? 例如,不同的CXX选项或安装可执行文件的不同路径

这是一个基本的cMakeList.txt,它为发布和调试模式创建一个makefile

cmake_minimum_required(VERSION 3.10)

# set the project name
project(Tutorial)

# add the executable
add_executable(Tutorial main.cpp)
set(CMAKE_CXX_STANDARD 17)
ADD_CUSTOM_TARGET(debug
  COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
  COMMENT "Creating the executable in the debug mode.")

ADD_CUSTOM_TARGET(release
  COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Release ${CMAKE_SOURCE_DIR}
  COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
  COMMENT "Creating the executable in the release mode.")

它是如何扩展以支持不同的Cxx选项的?

在此
CMakeLists.txt
文件中,您在配置原始项目期间设置了项目的第二个版本,该版本负责为发布版本生成项目的另一个版本。这种方法有几个缺点:

  • 不正确处理多配置生成器(例如Visual Studio)
  • 如果您将
    -DCMAKE\u BUILD\u TYPE=release
    传递给原始设置,它将设置两次发布配置
  • 它共享相同的二进制目录;这很容易把项目搞得一团糟
我的建议是在所有允许的地方使用

target_link_libraries(my_target PRIVATE
    $<$<CONFIG:Release>:libLinkedInReleaseOnly>
    $<$<CONFIG:Debug>:libLinkedInDebugOnly>
)

# define preprocessor macro containg the configuration name
target_compile_definitions(my_target PRIVATE MY_CONFIG_DEFINE=\"$<CONFIG>\")

它允许您执行
cmake--build Debug
cmake--build Release
来分别构建项目的调试或发布配置。(您可能希望将其设置在不同于源目录的位置,顺便说一句,这将要求您作为
-S
参数传递不同的路径。)

一些生成器支持在单个生成目录中进行多个生成配置,但最后我检查makefile不支持。您必须使用两个不同的构建目录,并在配置时使用
CMAKE\u build\u TYPE
变量。
#bash example
for CONFIG in Debug Release
do
    mkdir $CONFIG
    cmake -D CMAKE_BUILD_TYPE=$CONFIG -S . -B $CONFIG
done