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

如何确定ldd列出的库中哪些需通过CMake配置链接依赖?

已编译库foo.so的CMake目标依赖配置指南

问题背景

我需要为已编译的动态库foo.so创建CMake目标,用ldd检测到它的依赖项如下:

linux-gate.so.1 (0xf77d4000)
libm.so.6 => /lib/libm.so.6 (0xf5de7000)
libc.so.6 => /lib/libc.so.6 (0xf5c0c000)
libdl.so.2 => /lib/libdl.so.2 (0xf5c07000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf5be8000)
librt.so.1 => /lib/librt.so.1 (0xf5bde000)
/lib/ld-linux.so.2 (0xf77d5000)

目前我已经明确配置了以下内容:

find_package(Threads REQUIRED)
target_link_libraries(foo INTERFACE Threads::Threads)

以及:

target_link_libraries(foo INTERFACE ${CMAKE_DL_LIBS})

但不确定其余依赖库的处理方式,比如针对librt.so.1,我写了这段代码:

if(UNIX AND NOT APPLE)
    target_link_libraries(foo INTERFACE rt) # Not 100% sure this is necessary
endif()

想请教这段代码是否必要?其他库又该如何处理?注:我不需要知道这些库对应的CMake包名称,只想明确每个库是可以忽略,还是需要在CMakeLists.txt中配置。


各依赖库的处理说明

  • linux-gate.so.1:直接忽略。这是Linux内核提供的虚拟库,仅用于系统调用跳转,不需要手动链接,CMake和编译器也不会处理它。
  • libm.so.6:无需额外配置。C/C++编译器默认会自动链接数学库libm,CMake会继承编译器的默认行为,不用手动添加到INTERFACE_LINK_LIBRARIES。
  • libc.so.6:直接忽略。这是C标准库,编译器默认会自动链接,CMake会负责处理相关依赖,不需要手动配置。
  • libdl.so.2:你的配置是对的。${CMAKE_DL_LIBS}是CMake提供的变量,会根据平台自动对应dl库(Linux下就是libdl),无需额外操作。
  • libpthread.so.0:你的配置是对的。Threads::Threads是CMake提供的标准目标,会自动处理跨平台的线程库依赖(Linux下对应libpthread),比直接链接pthread更可靠。
  • librt.so.1:这段代码是必要的。librt(实时库)包含了shm_open、sem_open等POSIX实时API,并不是所有UNIX-like系统都会默认链接它(比如Linux需要手动链接,而macOS没有这个库)。你写的条件判断if(UNIX AND NOT APPLE)能准确覆盖需要链接rt的场景,配置正确。
  • /lib/ld-linux.so.2:直接忽略。这是Linux的动态链接器,负责加载动态库,不需要手动链接,系统会自动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:35:19