gpt4 book ai didi

cmake - 如何让 cMake 仅对项目中的一部分目录使用 Debug 编译模式?

转载 作者:行者123 更新时间:2023-12-04 18:04:17 27 4
gpt4 key购买 nike

改写了这个问题。

我有以下问题:

我的项目有几个二进制文件和库,它们驻留在主项目文件夹下的不同子目录中。
能够仅调试其中的一个子集而无需在 Debug模式下重新编译整个项目是很有用的。

我希望只能以半自动方式更改此子集的编译模式。

如何使用 CMake 完成此操作?

最佳答案

如果更改构建类型,整个项目将从头开始重新编译。通常你会保留 2 个独立的构建树,一个配置的调试和一个配置的发布。

请注意 CMAKE_BUILD_TYPE可以从命令行或从 cmake-gui 设置,你不应该在 CMakeLists.txt 文件中设置它。

要在 Debug模式下仅编译项目的某些部分,您可以按照以下步骤进行。在您的主 CMakeLists.txt 中,在包含任何子目录之前,定义以下宏:

macro (CHECK_IF_DEBUG)
if (NOT (CMAKE_BUILD_TYPE MATCHES Debug))
get_filename_component(THIS_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME)
STRING(REGEX REPLACE " " "_" THIS_DIR ${THIS_DIR}) #Replace spaces with underscores
if (DEFINED DEBUG_${THIS_DIR})
message(STATUS "Note: Targets in directory ${THIS_DIR} will be built Debug") #A reminder
set (CMAKE_BUILD_TYPE Debug)
endif()
endif()
endmacro()

然后,在每个子目录中添加(在 CMakelists.txt 的开头)宏调用
 CHECK_IF_DEBUG()

当你需要临时调试你项目的一部分(子目录)时,在cmake-gui中打开你的项目,并定义一个名称为 DEBUG_<DirectoryName>的变量(“Add Entry”) .您可以定义多个。 如果您的目录名称包含空格,请在变量名称中将它们替换为下划线 .不要忘记点击 ConfigureGenerate从 cmake-gui 使更改生效。分配给变量的值并不重要,它可以留空。

完成调试后,返回 cmake-gui 并删除相应的条目。别忘了 ConfigureGenerate .

我已经在一个小项目中对其进行了测试,它似乎可以正常工作。

注意:如果您在同一个 CMakeLists.txt(=在同一个子目录中)中创建多个目标( add_libraryadd_executable ),我还没有找到一种以一种方式构建一个目标和一个目标的方法另一种说法:似乎唯一重要的是 CMAKE_BUILD_TYPE 的值。 CMake 完成解析文件时的目录。

为了回答您的评论,您可以通过在 block 中添加以下行来在构建时打印提醒:
add_custom_target(info_${THIS_DIR} ALL COMMAND echo Targets in directory ${THIS_DIR} are built Debug)

add_custom_target .

关于cmake - 如何让 cMake 仅对项目中的一部分目录使用 Debug 编译模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848176/

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