如何通过自定义命令/目标将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
相关产品推荐
相关产品推荐

