【发布时间】: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不是动态链接而是作为共享库的好吧,共享对象是“动态库”的同义词。