Общие библиотеки не найдены

У меня есть программа, которая использует несколько общих библиотек. Я могу скомпилировать и запустить программу на компьютере, на котором она была скомпилирована. Когда я пытаюсь скопировать исполняемый файл на другой компьютер и запустить его после установки необходимых пакетов через apt-get, я получаю следующую ошибку:

«ошибка при загрузке общих библиотек: libconfig ++. so.8: невозможно открыть общий объектный файл: такого файла или каталога нет»

После запуска $ locate libconfig++.soЯ узнаю, что у меня установлена ​​текущая система libconfig ++. So.9, а не libconfig.so.8.

Затем я вручную скопировал все общие библиотеки в новую систему вместе с исполняемым файлом, после чего программа работала нормально. Я не думаю, что это будет долгосрочным решением, поскольку библиотеки не будут получать исправления и обновления, которые они обычно получают, создавая тем самым потенциальную угрозу безопасности.

Есть ли какой-нибудь способ, которым я могу скомпилировать свою программу так, чтобы она зависела от libconfig ++., В отличие от libconfig ++. So.x, или есть какой-то способ для меня, чтобы вручную включить определенные общие библиотеки, все еще позволяя их обновлять?

Я также учел тот факт, что я делаю что-то совершенно не так, как распространяю свою программу. Есть ли способ распространять мою программу таким образом, чтобы этого вообще не было?

1

Решение

Когда вы компилируете свою программу с -lsomelibrary, компилятор будет искать libsomelibrary.so в вашей системе, который будет связан с чем-то вроде libsomelibrary.so.x.y С этого момента ваше программное обеспечение привязано к этому конкретному основной версия (это х в имени).

Это означает, что он будет работать только с библиотекой серии x. Если дистрибутив поставляется с более новой версией с той же основной версией (скажем, libsomelibrary.x.z), ваше приложение должно работать правильно.

Тем не менее, вы не разрешено использовать другую основную версию библиотеки. Если вы это сделаете (связав основную версию с другой версией), как кто-то предложил здесь, приложение может запуститься (или может произойти сбой в самом начале), но вы никогда не будете уверены, что приложение будет работать как запланировано.

TL’DR:

Когда вы компилируете, компоновщик ищет libsomelibrary.so, который будет связан с определенной версией, такой как libsomelibrary.so.x.y.

Когда вы запустите ваше приложение, система будет искать libsomelibrary.so.x. * (Та же основная версия, любая дополнительная версия)

Для получения более подробной информации по этому вопросу см. http://www.ibm.com/developerworks/linux/library/l-shlibs/index.html

3

Другие решения

Чтобы ответить на вопрос в вашем последнем абзаце: Стандартный способ распространения двоичных файлов (особенно тех, которые зависят от общих объектов) — это использование системы управления пакетами целевого дистрибутива (dpkg, rpm или оба). Эти форматы пакетов потребуют, чтобы в системе были установлены зависимости (libconfig ++, в вашем случае). А если нет, пользователь может использовать apt / yum для автоматической загрузки и установки.

1

проверьте ваш make-файл, если он запрашивает загрузку совместно используемой библиотеки версии 9.

Это зависит от использования функции, которую вызывает ваша программа.

Скажем, если между 8-9-й версией библиотеки нет значительного изменения функции w.r.t, которую вы вызываете, вам потенциально не нужно копировать библиотеки.

Конечно создание символического вроде бы хотелось.

Если вы думаете, ваша программа не должна зависеть от всех этих вещей.

Перейти к статической библиотеке, вы сможете найти libconfig.a архив, вы можете связать с вашей программой, следовательно, нет никакой зависимости, когда вы запускаете другие машины.

-1
По вопросам рекламы [email protected]