如何在CMake中创建依赖另一个.so文件的共享对象?
如何在CMake中链接外部共享库(libconnlib.so)
嘿,我来帮你把你的DAL共享库链接到libconnlib.so!其实只需要在你的CMakeLists.txt里加几步配置就行,下面是具体的操作方法和修改后的完整代码:
核心步骤说明
要链接外部共享库,我们需要做两件事:
- 让CMake找到
libconnlib.so的位置 - 把它关联到你的
DAL目标上
方法1:使用find_library(推荐,更规范)
如果libconnlib.so在系统标准库路径(比如/usr/lib)里,或者你知道它的具体路径,可以用find_library来定位它,然后通过target_link_libraries链接:
# 查找libconnlib.so,NAMES指定库名(去掉lib前缀和.so后缀) # 如果库不在标准路径,用PATHS参数指定路径,比如PATHS /home/your/libs find_library(CONN_LIB NAMES connlib) # 确保找到库,否则报错 if(NOT CONN_LIB) message(FATAL_ERROR "找不到libconnlib.so,请检查路径是否正确!") endif() # 将找到的库链接到DAL目标 target_link_libraries(DAL PRIVATE ${CONN_LIB})
方法2:直接指定库路径(适合快速测试)
如果你明确知道libconnlib.so的所在目录,可以用target_link_directories先指定路径,再链接库:
# 指定libconnlib.so所在的目录 target_link_directories(DAL PRIVATE /path/to/your/libconnlib/dir) # 链接库(这里写库名connlib,CMake会自动识别libconnlib.so) target_link_libraries(DAL PRIVATE connlib)
修改后的完整CMakeLists.txt
下面是把方法1整合到你原文件后的完整代码,我标注了新增的部分:
cmake_minimum_required(VERSION 3.9) project(DAL VERSION 1.0.1 DESCRIPTION "DAL - Data Access Layer this class connect with the sql data base throw the Connection class") set(CMAKE_CXX_STANDARD 17) include(GNUInstallDirs) # ---------------------- 新增部分开始 ---------------------- # 查找libconnlib.so,若不在标准路径请添加PATHS参数 find_library(CONN_LIB NAMES connlib) if(NOT CONN_LIB) message(FATAL_ERROR "找不到libconnlib.so,请检查库路径是否正确!") endif() # ---------------------- 新增部分结束 ---------------------- add_library(DAL SHARED src/AppSettingDAL.cpp src/AppSettingEntity.cpp src/SettingsModificationDAL.cpp src/SymbolDAL.cpp src/SymbolInfoEntity.cpp ) set_target_properties(DAL PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1 PUBLIC_HEADER include/AppSettingsDAL.hpp include/SettingsModificationDAL.hpp include/AppSettingEntity.hpp include/SymbolDAL.hpp include/SymbolInfoEntity.hpp ) configure_file(DAL.pc.in DAL.pc @ONLY) target_include_directories(DAL PRIVATE .) # ---------------------- 新增部分开始 ---------------------- # 将libconnlib.so链接到DAL target_link_libraries(DAL PRIVATE ${CONN_LIB}) # ---------------------- 新增部分结束 ---------------------- install(TARGETS DAL LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) install(FILES ${CMAKE_BINARY_DIR}/DAL.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
补充说明
- 使用
PRIVATE是因为libconnlib.so是DAL内部依赖的库,不需要暴露给其他依赖DAL的目标;如果其他目标也需要用到这个库,可以改成PUBLIC。 - 如果你的
libconnlib有对应的头文件,别忘了用target_include_directories把头文件目录加进去,比如:target_include_directories(DAL PRIVATE /path/to/connlib/include)
内容的提问来源于stack exchange,提问作者yaodav
相关产品推荐
相关产品推荐

