CMake - ссылка на библиотеки stati c и Dynami c - PullRequest
1 голос
/ 18 июня 2020

У меня есть проект CMake, который должен работать в очень старой системе ARM. Поскольку система имеет другую версию libc, то единственная возможность - связать инструментальную цепочку с libc статически.

Проблема в том, что помимо libc приложение должно быть связано с другим динамическим c библиотека. 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)

Я понятия не имею, почему это происходит, но по какой-то причине g cc связал мои приложения с неправильными версиями библиотеки c:

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

I Я прочитал много похожих сообщений и вижу, что мне нужно добавить

target_link_libraries(${PROJECT_NAME} PUBLIC -static)

Но это вызывает другую ошибку:

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

Так что я понятия не имею, как скомпилировать все это вместе.

1 Ответ

0 голосов
/ 18 июня 2020

Что ж, после долгих поисков я нашел решение. Добавление следующей строки:

target_link_libraries(${PROJECT_NAME} PUBLIC rt)

решает проблему. Нет необходимости в опции -static.

и да, я понятия не имею, почему она работает.

...