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

