如何用相对路径在CMake中链接两个库?附项目结构示例
解决CMake中基于相对路径链接两个库的问题
我来帮你搞定这个CMake库链接的需求,基于你给出的项目结构,咱们用现代CMake的最佳实践来调整配置,全程用相对路径且避免硬编码:
第一步:完善子库的CMakeLists.txt
1. src/project/libA/CMakeLists.txt
这个文件里需要明确生成库目标,并用CMake内置变量处理相对路径:
# 生成静态库(如果需要动态库就把STATIC改成SHARED) add_library(libA STATIC libA.cpp libA.h) # 用相对路径暴露头文件目录,PUBLIC表示依赖libA的目标会自动继承这个路径 target_include_directories(libA PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
这里的${CMAKE_CURRENT_SOURCE_DIR}是CMake内置变量,自动指向当前CMakeLists.txt所在的目录,完美替代硬编码的相对路径,项目移动后也不会出错。
2. src/project/libB/CMakeLists.txt
如果libB依赖libA,就在这里完成依赖链接;如果只是独立库,也可以只定义自身目标:
add_library(libB STATIC libB.cpp libB.h) # 同样用相对路径暴露自身头文件 target_include_directories(libB PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # 如果libB需要调用libA的代码,直接链接libA目标即可 # 根目录已经通过add_subdirectory导入了libA,所以这里能直接用目标名 target_link_libraries(libB PUBLIC libA)
第二步:调整根目录CMakeLists.txt
根目录的配置可以更简洁,同时如果需要生成可执行文件(比如你的项目最终要产出一个APP),可以在这里把两个库链接到目标上:
project(project) # 添加子目录,CMake会自动处理子目录里的库目标,无需手动指定路径 add_subdirectory(src/project/libA) add_subdirectory(src/project/libB) # 示例:如果有主程序源文件(比如src/main.cpp),生成可执行文件 add_executable(my_app src/main.cpp) # 链接两个库,直接用子目录定义的目标名,CMake会自动处理相对路径找到库文件 target_link_libraries(my_app PUBLIC libA libB)
关键说明
- 为什么不用全局
include_directories?因为它会污染整个CMake上下文,用target_include_directories的PUBLIC/PRIVATE范围控制,更符合模块化设计,只有真正依赖的目标才会拿到头文件路径。 - 直接用库目标名链接(比如
libA)是CMake推荐的方式,add_subdirectory会把子目录的目标导入到当前上下文,CMake自动管理库文件的路径,不需要你手动写../libA/liblibA.a这种硬编码的相对路径。
内容的提问来源于stack exchange,提问作者user2255757
相关产品推荐
相关产品推荐

