【问题标题】:CMake - link with both static and dynamic librariesCMake - 与静态和动态库的链接
【发布时间】:2023-03-05 16:21:01
【问题描述】:

我有一个CMake 项目,它应该在非常旧的ARM 系统上运行。由于系统有不同的libc版本,那么工具链的唯一选择就是静态链接libc

问题在于,除了libc,应用程序还应该与另一个动态库链接。 CMakeFiles.txt 如下所示:

target_link_libraries(${PROJECT_NAME} PUBLIC -static-libstdc++)
target_link_libraries(${PROJECT_NAME} PUBLIC -static-libgcc)

add_subdirectory(my_dynamic_library)
target_link_libraries(${PROJECT_NAME} PRIVATE my_dynamic_library)

但看起来libc 没有动态链接,而是作为共享库:

readelf -d my_app

Dynamic section at offset 0x34668 contains 29 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [my_dynamic_library.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]

在目标系统上运行时出现错误:

./my_app: /lib/libc.so.6: version `GLIBC_2.17' not found (required by ./my_app)

我不知道为什么会这样,但出于某种原因,gcc 将我的应用与错误的 libc 版本相关联:

objdump -T ./my_app| grep 2.17
000103a8      DF *UND*  00000000  GLIBC_2.17  clock_gettime

我看了很多类似的帖子,我看到我必须添加

target_link_libraries(${PROJECT_NAME} PUBLIC -static)

但这会导致另一个错误:

../arm-none-linux-gnueabi/bin/ld: attempted static link of dynamic object my_dynamic_library.so

所以我不知道如何将所有这些编译在一起。

【问题讨论】:

  • > 但是貌似libc不是动态链接而是作为共享库的好吧,共享对象是“动态库”的同义词。

标签: c cmake arm glibc


【解决方案1】:

好吧,经过长时间的搜索,我找到了解决方案。添加以下行:

target_link_libraries(${PROJECT_NAME} PUBLIC rt)

解决了这个问题。不需要-static 选项。

是的,我不知道它为什么会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2013-03-09
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多