CMake 系列(二十一):链接动态库并指定路径的多种方法

实际开发中,需要链接的动态库往往不在系统默认的搜索路径上,这时就需要在 CMake 中显式指定库的位置。本文整理了链接动态库并指定其路径的几种常用方法,并比较各自的适用场景和优缺点。

此方法会将指定路径添加到链接器的搜索路径中,适用于多个目标需要链接同一路径下的库。

# 1. 添加动态库的搜索路径
link_directories(/path/to/your/library)

# 2. 创建可执行文件
add_executable(demo main.c)

# 3. 链接动态库(仅需指定库名,无需完整路径)
target_link_libraries(demo SomeLib)

说明:

  • link_directories() 是全局的,会影响后续所有 target_link_libraries() 的搜索路径。
  • 动态库文件名需以 lib 开头(如 libSomeLib.so)。

方法 2:直接指定动态库的完整路径

直接在 target_link_libraries() 中指定动态库的完整路径。

# 1. 创建可执行文件
add_executable(demo main.c)

# 2. 链接动态库(直接指定完整路径)
target_link_libraries(demo /path/to/your/library/libSomeLib.so)

说明:

  • 优点:路径明确,无需额外配置。
  • 缺点:路径硬编码,灵活性较差。

方法 3:使用 find_library 动态查找库路径

通过 find_library() 查找动态库路径,并将查找结果传递给 target_link_libraries()。

# 1. 查找动态库(可指定搜索路径)
find_library(SomeLib_LIBRARY
    NAMES SomeLib        # 库名(不包含前缀 lib 和后缀 .so)
    PATHS /path/to/your/library
)

# 2. 创建可执行文件
add_executable(demo main.c)

# 3. 链接动态库
target_link_libraries(demo ${SomeLib_LIBRARY})

说明:

  • NAMES 参数中的 SomeLib 对应库文件名 libSomeLib.so。
  • PATHS 可指定多个搜索路径(用空格分隔)。
  • 如果未找到库,SomeLib_LIBRARY 会为空,需检查路径是否正确。

方法 4:设置 CMAKE_LIBRARY_PATH 或 CMAKE_PREFIX_PATH

通过设置全局变量,让 CMake 自动查找动态库路径。

# 1. 设置全局库路径(CMake 会自动搜索这些路径)
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /path/to/your/library)
# 或
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} /path/to/your/library)

# 2. 使用 find_library 查找库(无需手动指定 PATHS)
find_library(SomeLib_LIBRARY NAMES SomeLib)

# 3. 创建可执行文件并链接库
add_executable(demo main.c)
target_link_libraries(demo ${SomeLib_LIBRARY})

说明:

  • CMAKE_LIBRARY_PATH 是 CMake 的默认搜索路径之一。
  • 适合需要多次查找库的场景。

此方法针对特定目标设置链接路径,避免全局污染。

# 1. 创建可执行文件
add_executable(demo main.c)

# 2. 为该目标指定链接路径
target_link_directories(demo PRIVATE /path/to/your/library)

# 3. 链接动态库(仅需库名)
target_link_libraries(demo SomeLib)

说明:

  • PRIVATE 表示仅对当前目标生效,PUBLIC 或 INTERFACE 可控制作用范围。
  • 需 CMake 3.13 或更高版本支持。

验证动态库是否正确链接

  1. 编译后检查目标文件:
ldd demo
# 输出应包含动态库路径(如 /path/to/your/library/libSomeLib.so)
  1. 运行时路径问题:
  • 如果运行时提示找不到库,需设置 LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH
  • 或在 CMake 中设置 RPATH(推荐):
set(CMAKE_INSTALL_RPATH /path/to/your/library)

总结

方法 适用场景 优点 缺点
link_directories 全局路径共享 简单直接 全局生效,可能污染其他目标
直接指定路径 路径固定 明确无歧义 不灵活
find_library 动态查找 灵活,支持多路径 需手动处理查找失败情况
CMAKE_LIBRARY_PATH 全局搜索路径 适合多库项目 全局生效
target_link_directories 特定目标 精细控制 需 CMake 3.13+

根据项目需求选择合适的方法即可!

系列导航


   转载规则


《CMake 系列(二十一):链接动态库并指定路径的多种方法》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
CMake 系列(二十二):让 CMake 支持 GDB 调试 CMake 系列(二十二):让 CMake 支持 GDB 调试
CMake 和 GDB 的结合确实能使 C 或 C++ 的开发工作变得轻松,它们可以共同实现跨平台的项目构建和源代码级别的调试。本文详细介绍如何使用 CMake 配置项目以便使用 GDB 进行调试,并给出一个 C 语言的 demo。 如何支
2022-08-09
下一篇 
CMake 系列(二十):用 target_sources 避免全局变量 CMake 系列(二十):用 target_sources 避免全局变量
上一篇使用 add_subdirectory() 把项目分割成几个范围有限的 CMakeLists.txt 文件。本文讨论另一种方法:不使用 add_subdirectory(),而是使用模块 include 来组装不同的 CMakeLis
2022-07-26
  目录