Задать вопрос
@Skodio29

Как включить libc в so или победить ошибку на сторонней машине?

Добрый день.
Необходимо сделать самодостаточную разделяемую библиотеку для распространения на других машинах.
На моей машине, всё окей библиотека работает, что логично.
На другой системе я получаю ошибку вида:
20(0x00000014): /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found


Я пытался использовать флаг -lc, использовал target_link_libraries() с указанием пути к .a libc. Тщетно.
Я уже начал городить огород, поэтому решил спросить сообщество.
Я далеко не профи, поэтому прошу помочь.

Текущие параметры линковки CMake выглядят так:
if(UNIX)
    set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-Wl,--no-undefined -Xlinker --version-script -Xlinker ${CMAKE_CURRENT_SOURCE_DIR}/version.script -static-libgcc -static-libstdc++ -lpthread -ldl -lc")
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        target_link_libraries(${TARGET_NAME} ${CMAKE_SOURCE_DIR}/obj/x64/weather_caster.a)
    else()
         target_link_libraries(${TARGET_NAME} ${CMAKE_SOURCE_DIR}/obj/x86/weather_caster.a)   
    endif()
endif()
  • Вопрос задан
  • 274 просмотра
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 2
ValdikSS
@ValdikSS
Компилируйте вашу библиотеку на самом старом дистрибутиве (а точнее, используйте заголовочные файлы и линкуйте с самой старой glibc), которую собираетесь поддерживать.

CentOS 6 покроет все дистрибутивы за последние 10 лет.

Можно также попробовать различные хаки, подменяющие заголовочные файлы от старых версий glibc, для использования символов старших версий.

См.
Ответ написан
Комментировать
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Я уже начал городить огород,

Потому что не понимаете смысла выдаваемого Вам сообщения.

А происходит вот что:
Каждая версия libc имеет внутри себя идентификатор версии - вот эту самую константу GLIBC_2.XX. Это сделано намеренно для предотвращения ошибок при запуске программы, слинкованной с версией libc, выше чем установленная на компьютере.
Для предотвращения такой ошибки нужно:
- либо установить еще одну libc с самой низкой версией, которую найдете (не самый лучший вариант, могут быть проблемы)
- либо на виртуалке развернуть один из старых дистрибов, какой найдете и собрать Вашу библиотеку в ней (тоже так себе вариант - в старых libc есть недоработки, дыры и нереализованные возможности)
- либо заранее ограничить установщик некоей версией libc, проверять при установке и не ставить, если не так.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы