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

如何在CMake中链接依赖其他库的静态库?

解决CMake链接依赖第三方库的静态库时的未定义引用问题

静态库仅包含自身编译生成的目标代码,不会打包它依赖的第三方库(如gtkmm)的代码。当客户端仅链接liblibrary.a时,编译器无法找到gtkmm相关的函数符号,因此触发未定义引用错误。

推荐方案:利用CMake依赖传递机制

1. 修改静态库的CMakeLists.txt

将库的依赖配置改为PUBLIC作用域,让CMake自动将依赖传递给链接该库的目标:

cmake_minimum_required(VERSION 3.28)
project(library)

set(CMAKE_CXX_STANDARD 23)

find_package(PkgConfig REQUIRED)
pkg_check_modules(GTKMM REQUIRED gtkmm-3.0)

add_library(library STATIC library.cpp library.h)

# 暴露库的头文件及gtkmm的头文件给客户端
target_include_directories(library PUBLIC
    ${GTKMM_INCLUDE_DIRS}
    ${CMAKE_CURRENT_SOURCE_DIR}
)

# 将gtkmm依赖设为PUBLIC,使客户端链接该库时自动继承依赖
target_link_libraries(library PUBLIC ${GTKMM_LIBRARIES})

2. 修改客户端的CMakeLists.txt

如果库与客户端属于同一项目,直接用add_subdirectory引入库;若库为独立构建,可通过安装导出或find_package引入,示例:

cmake_minimum_required(VERSION 3.28)
project(cairomotion)

set(CMAKE_CXX_STANDARD 23)

# 引入静态库项目(替换为实际的库路径)
add_subdirectory(/home/user/Projects/library)

add_executable(client main.cpp)

# 直接链接静态库,CMake会自动处理gtkmm的依赖
target_link_libraries(client PRIVATE library)

临时方案:客户端手动链接所有依赖

若不想修改静态库的CMake配置,可在客户端CMake中手动引入gtkmm依赖,并同时链接静态库与gtkmm库:

cmake_minimum_required(VERSION 3.28)
project(cairomotion)

set(CMAKE_CXX_STANDARD 23)

include_directories(/home/user/Projects/library)

# 手动查找并配置gtkmm依赖
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTKMM REQUIRED gtkmm-3.0)
include_directories(${GTKMM_INCLUDE_DIRS})
link_directories(${GTKMM_LIBRARY_DIRS})

add_executable(client main.cpp)

# 同时链接静态库和gtkmm库
target_link_libraries(client /home/user/Projects/library/cmake-build-debug/liblibrary.a ${GTKMM_LIBRARIES})

内容的提问来源于stack exchange,提问作者mltm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:13:17