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

如何更简洁地链接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:12:57