бинарный файл linux не зависит от разделяемых библиотек

У меня есть программа на С++, которая зависит от нескольких библиотек (некоторые общие системные библиотеки, такие как libjpeg, некоторые личные библиотеки, которые не установлены в масштабе всей системы). Программа хорошо компилируется на машине A (Debian Squeeze). Я хотел бы запустить программу на машине B (Ubuntu maveric) и машине C (Arch). Предположим, что обе машины B+C предельно минимальны. Не ожидайте найти там ЛЮБЫЕ библиотеки, которые использует моя программа, и если они есть, они не той же версии.

Есть ли какая-нибудь программа, которая может сканировать мою программу на ВСЕ зависимости (используя ldd или что-то еще), собирать все эти зависимости и генерировать скрипт, который сообщит двоичному файлу использовать эти и только те библиотеки, с которыми он поставляется в любой другой системе?

Благодарю вас !


person Joekk3    schedule 27.01.2011    source источник
comment
удачи в этом; в качестве альтернативы вы можете просто доставить исходный код, как это принято   -  person David Heffernan    schedule 27.01.2011
comment
Я не планирую поставлять. Я хочу это для собственного использования. У меня есть исходный код, но перекомпиляция может быть настоящей болью. Например, компиляторы обычно предполагают, что безопасно использовать другую версию библиотеки. Однако это не всегда так - я хочу быть на 100% уверенным, что программа использует ТОЧНО одни и те же библиотеки на каждой машине.   -  person Joekk3    schedule 27.01.2011
comment
Не похоже, что вы делаете это правильно. Это должно быть легко собрать из исходников. На твоем месте я бы сосредоточился на решении этой проблемы.   -  person David Heffernan    schedule 27.01.2011
comment
@David Heffernan Похоже, вы используете гораздо более интеллектуальную систему сборки, чем я. Заботиться, чтобы поделиться ? (Имейте в виду, что я не хочу писать определенные Makefiles, Cmake findscripts или что-то еще для каждой системы)   -  person Joekk3    schedule 27.01.2011
comment
klik раньше мог автоматически создавать рецепты из пакетов и зависимостей Debian, но это не было обновлен через некоторое время, и формат .deb был немного обновлен за это время, поэтому я не уверен, что он все еще работает.   -  person ephemient    schedule 27.01.2011


Ответы (2)


Я не уверен на 100%, что понимаю ваш вопрос, но похоже, что вы хотите отправить библиотеки вместе со своим пакетом и использовать LD_LIBRARY_PATH, чтобы заставить компоновщик заглянуть в каталог вашей поставляемой библиотеки, прежде чем что-либо еще.

Если есть что-то еще, я могу пересмотреть свой ответ, поскольку у меня есть некоторый опыт в этом. Просто хочу убедиться, что я знаю, о чем вы просите.

person joshk0    schedule 27.01.2011
comment
Это звучит правильно. Так это сработает? Всегда ли компилятор (в моем случае gcc) использует библиотеки в LD_LIBRARY_PATH, скажем, библиотеки в /usr/lib? Кроме того, если это так: есть ли какая-либо программа, которая автоматически анализирует вывод ldd -v (это должно дать мне все зависимости, верно?) и копирует все библиотеки в каталог? - person Joekk3; 27.01.2011
comment
+1 к решению LD_LIBRARY_PATH. Другой вариант — сделать статические сборки всех зависимых библиотек и связать их все вместе в один монолитный двоичный файл. - person gravitron; 27.01.2011
comment
Джокк, верно. Порядок следующий: rpaths (каталоги lib, встроенные в исполняемый файл, запрашивающий его), LD_LIBRARY_PATH, затем пути по умолчанию в /etc/ld.so.conf. Посмотрите linux.die.net/man/8/ld-linux для подробнее. - person joshk0; 27.01.2011

Оказывается, ответ на ваш вопрос заключается в статической ссылке, скажем, с помощью g++ -static.

person Joshua    schedule 27.01.2011
comment
+1, при условии, что вы изолируете статическую сборку в режиме выпуска и не присутствуете в режиме отладки/разработки. - person San Jacinto; 27.01.2011
comment
Моя единственная разница между отладкой и выпуском - это -strip. - person Joshua; 28.01.2011
comment
Тогда я бы сказал, что если вы включаете что-то, кроме стандартных библиотек, это глупо просто потому, что время сборки занимает больше времени. - person San Jacinto; 28.01.2011
comment
У меня достаточно дискового кеша и мощности процессора, и мне все равно. - person Joshua; 28.01.2011
comment
Я думаю, что я слишком привык к необходимости создавать и переносить двоичный файл на встроенную плату. - person San Jacinto; 28.01.2011