Как копировать библиотеки, на которые строится динамически связанная программа?
Недавно я занимался компиляцией и распространением программного обеспечения. В прошлый раз я сделал это, собрав свою программу и запустив на ней 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) ./
Это даст некоторые сообщения об ошибках, но их можно игнорировать.