【问题标题】:Cmake create a Makefile supports debug and release with different configurationCmake 创建 Makefile 支持不同配置的调试和发布
【发布时间】:2021-03-10 19:37:25
【问题描述】:

是否可以为调试和发布模式生成一个 makefile,使用 cMake 进行不同的配置? 例如不同的 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 选项?

【问题讨论】:

  • 一些生成器在单个构建目录中支持多个构建配置,但最后我检查了 makefile 不支持。您必须使用两个不同的构建目录并在配置时使用 CMAKE_BUILD_TYPE 变量。

标签: cmake


【解决方案1】:

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

  • 不能正确处理多配置生成器(例如 Visual Studio)
  • 如果您将-DCMAKE_BUILD_TYPE=Release 传递给原始设置,它会设置两次发布配置。
  • 共享同一个二进制目录;这很容易把项目搞得一团糟

我的建议是在所有允许的地方使用generator expressions

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>\")

并回退到与配置相关的 propertiesvariables 版本(即在链接列表中包含 &lt;CONFIG&gt;)并在具有不同配置的多个构建目录中设置项目。

#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 参数传递。)

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 2012-02-19
    • 1970-01-01
    • 2015-02-14
    • 2010-11-27
    • 2015-02-01
    • 2011-04-27
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多