CMake跨目录链接目标文件问题求助
解决方案
核心思路是把Input相关代码抽离为库目标,让主程序和测试程序都能通过CMake的目标依赖机制复用,这是CMake项目中复用代码的标准做法。
1. 重构driver/CMakeLists.txt
将原来直接打包进可执行文件的Input.cpp拆分为独立库,再让Driver可执行文件链接该库:
# 创建静态库(若需要动态库可改用add_library(Input SHARED ...)) add_library(Input STATIC Input.cpp Input.hpp) # 主程序Driver链接Input库 add_executable(Driver main.cpp) target_link_libraries(Driver PRIVATE Input)
2. 修改test/CMakeLists.txt
现在可以直接通过库目标链接Input,无需硬编码编译产物路径:
# 让测试程序能找到Input的头文件 target_include_directories(test PRIVATE ${PROJECT_SOURCE_DIR}/driver) # 链接Input库 target_link_libraries(test PRIVATE Input)
原方案问题说明
- 直接链接
.o文件:硬编码了编译产物路径,换编译目录、平台或修改CMake配置后极易失效,且不符合CMake的目标依赖管理逻辑。 - 链接
Driver可执行文件:CMake禁止将可执行文件作为依赖链接到其他目标,因为可执行文件并非为被链接设计,没有规范的符号导出机制(仅动态库支持被其他程序链接)。
额外说明
确保根目录CMakeLists.txt中已通过add_subdirectory(driver)和add_subdirectory(test)引入两个子目录,这样test目录就能直接访问driver目录定义的Input库目标。
内容的提问来源于stack exchange,提问作者YNW
相关产品推荐
相关产品推荐

