如何在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
相关产品推荐
相关产品推荐

