首页 > 解决方案 > Cmake 创建 Makefile 支持不同配置的调试和发布

问题描述

是否可以使用 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 选项?

标签: cmake

解决方案


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

  • 不能正确处理多配置生成器(例如 Visual Studio)
  • -DCMAKE_BUILD_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>\")

并回退到与配置相关的属性变量的版本(即包含<CONFIG>在链接列表中)并在具有不同配置的多个构建目录中设置项目。

#bash example
for CONFIG in Debug Release
do
    mkdir $CONFIG
    cmake -D CMAKE_BUILD_TYPE=$CONFIG -S . -B $CONFIG
done

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


推荐阅读