You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过自定义命令/目标将CMake项目关联到Make项目

问题:CMake自动构建Makefile生成的目标文件

我正在为一个原有Makefile构建的命令行程序开发GUI包装器,GUI使用CMake构建。项目结构如下:

project
├──gui
│  ├── CMakeLists.txt
├──instruments
│  ├── CORE.o
│  └── makefile
└──session
   ├── SESSION.o
   └── makefile

目前我已经能通过以下代码链接SESSION.o和CORE.o并包含头目录:

target_link_libraries(gui PRIVATE
                      ${CMAKE_CURRENT_SOURCE_DIR}/../session/SESSION.o
                      ${CMAKE_CURRENT_SOURCE_DIR}/../instruments/CORE.o)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../session
                    ${CMAKE_CURRENT_SOURCE_DIR}/../instruments)

但希望当SESSION.o或CORE.o未构建时,CMake能自动调用对应目录的make命令。尝试过多种add_custom_command和add_custom_target写法,均出现错误或CMake无法识别构建规则。求正确的关联方式,可接受每次构建时都尝试编译这些项目。


解决方案

方法一:每次构建都执行Make(简单直接)

为session和instruments目录分别创建自定义构建目标,再让GUI目标依赖这两个目标。这样每次构建GUI时,都会先执行对应目录的make命令:

# 构建session模块的自定义目标
add_custom_target(
    build_session
    COMMAND make
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../session
    COMMENT "Building session module..."
)

# 构建instruments模块的自定义目标
add_custom_target(
    build_instruments
    COMMAND make
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../instruments
    COMMENT "Building instruments module..."
)

# 让GUI目标依赖这两个自定义构建目标
add_dependencies(gui build_session build_instruments)

保留你原有的target_link_libraries和include_directories配置即可。

方法二:仅当目标文件不存在时执行Make(精确依赖)

通过add_custom_command定义目标文件的生成规则,让CMake自动检查SESSION.o和CORE.o是否存在,不存在才执行对应目录的make:

# 定义SESSION.o的生成规则
add_custom_command(
    OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/../session/SESSION.o
    COMMAND make
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../session
    MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/../session/makefile
    COMMENT "Building session/SESSION.o..."
)

# 定义CORE.o的生成规则
add_custom_command(
    OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/../instruments/CORE.o
    COMMAND make
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../instruments
    MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/../instruments/makefile
    COMMENT "Building instruments/CORE.o..."
)

# 让GUI目标依赖这两个生成的目标文件
add_dependencies(gui 
    ${CMAKE_CURRENT_SOURCE_DIR}/../session/SESSION.o
    ${CMAKE_CURRENT_SOURCE_DIR}/../instruments/CORE.o
)

同样保留原有的链接和头文件配置。


内容的提问来源于stack exchange,提问作者skidmarks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:42:21