Как копировать библиотеки, на которые строится динамически связанная программа?

Недавно я занимался компиляцией и распространением программного обеспечения. В прошлый раз я сделал это, собрав свою программу и запустив на ней ldd, чтобы получить все библиотеки, с которыми он был связан. Я получил путь к библиотеке (как, скажем, /lib/x86_64-linux-gnu/libc.so.6) и я скопировал и вставил его из моей системы. Это прекрасно работало, но копирование и вставка каждой библиотеки вручную казалось повторяющимся. Есть ли способ, которым я могу просто получить список путей к библиотекам в одиночку (без всех libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1dc3333000)) чтобы я мог их скопировать и распространять вместе с моей сборкой?

2 ответа

Решение

На этом этапе вы в основном создаете тарбол из всего дистрибутива Linux. В зависимости от библиотек, на которые вы ссылаетесь, простого включения самой динамической библиотеки может быть недостаточно (некоторые библиотеки зависят от подключаемых модулей и других внешних файлов, которые не установлены в тех же местах, что и те же версии, во всех дистрибутивах). Linux).

Есть несколько вариантов, чтобы справиться с этими различиями:

  • Распространите исходный код вашей программы и позвольте людям, которым вы распространяете, так, чтобы пользователи могли сами скомпилировать их, по своему выбору.
  • Перекомпилируйте версию вашей программы для каждой отдельной версии каждого другого дистрибутива Linux, который вы хотите поддерживать, и распространите вашу программу в пакетах для этих дистрибутивов и версий.
  • Скомпилируйте ваше приложение, используя статические ссылки, а не динамические. Если вы ссылаетесь на библиотеки, которые зависят от внешних модулей или файлов, это может быть проблематично.
  • Распространите образ виртуальной машины определенного дистрибутива Linux, который вы хотите поддерживать, это минимальная установка, и ваша программа установлена ​​по умолчанию, чтобы обеспечить полную среду для его запуска.

Я это выяснил (в основном).

Предположим, что созданная мною программа, которую я планирую распространять, находится в / bin / bash. Я мог бы создать новый каталог и выполнить следующую команду:cp $(ldd /bin/bash) ./

Это даст некоторые сообщения об ошибках, но их можно игнорировать.

Другие вопросы по тегам