如何更简洁地链接CMake目标,而非指定其输出文件的绝对路径?
CMake跨子项目依赖的正确实现方式
你的需求完全可以通过CMake的原生目标机制实现,根本不用手动写绝对路径,步骤如下:
1. 调整LibraryProject的CMakeLists.txt
确保LibraryProject里用add_library()定义一个明确的目标,比如:
# LibraryProject/CMakeLists.txt # 这里的LibraryTarget是自定义的库目标名,可根据项目需求修改 add_library(LibraryTarget STATIC src/xxx.cpp src/yyy.cpp) # 如果库有对外暴露的头文件,添加这行后,UiProject可直接引用头文件,无需额外配置include路径 target_include_directories(LibraryTarget PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include )
2. 修改UiProject的CMakeLists.txt
直接用LibraryProject中定义的目标名链接,无需任何路径:
# UiProject/CMakeLists.txt add_executable(UiProject src/main.cpp src/ui.cpp) # 直接写LibraryTarget即可,CMake会自动处理跨平台的路径、扩展名等细节 target_link_libraries(UiProject PRIVATE LibraryTarget)
这里的PRIVATE表示该依赖仅作用于UiProject自身;若UiProject还会被其他项目依赖,可根据实际需求替换为PUBLIC。
3. 顶层CMakeLists.txt无需改动
原有的顶层配置完全满足需求:
# 顶层CMakeLists.txt project(Project) add_subdirectory(LibraryProject) add_subdirectory(UiProject)
原理说明
CMake处理add_subdirectory(LibraryProject)时,会将其中定义的LibraryTarget目标注册到全局环境中,后续UiProject的CMake脚本可直接引用该目标名。CMake会自动处理库的输出路径、静态/动态库类型、平台相关扩展名等差异,完全无需手动指定路径。
内容的提问来源于stack exchange,提问作者Daniel Nowak
相关产品推荐
相关产品推荐

