Как я могу скомпилировать проект autotools со статически связанными зависимостями? - PullRequest
3 голосов
/ 22 мая 2010

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

Теперь, когда библиотека с открытым исходным кодом и нетпредоставленные двоичные файлы, я сам компилирую.В библиотеке используются автоинструменты, и я не нашел никакой полезной документации о том, как статически связывать зависимости.Я попытался вызвать скрипт configure с параметром --enable-static, но это, очевидно, говорит только о том, что configure скомпилирует статическую версию библиотеки, но мне нужна динамическая библиотека, которая включает все библиотеки, от которых она зависит.

Итак, мне нужен либо способ настроить configure для статической ссылки на зависимости, либо способ постобработки встроенной библиотеки для включения всех зависимостей.Может кто-нибудь сказать мне, как это сделать?

Да, и если это имеет значение: я на 64-битном Snow Leopard.

Ответы [ 2 ]

3 голосов
/ 25 апреля 2012

Если вы получили файл библиотеки .a , вы можете попробовать добавить следующее в Makefile.am вашего проекта.

yourproject_LDADD =  libxxx.a
2 голосов
/ 14 октября 2017

Недавно, пройдя этот путь самостоятельно, я обнаружил, что, к сожалению, статические библиотеки на самом деле не работают таким образом.

Когда вы создаете статический исполняемый двоичный файл, компоновщик просматривает все необходимые ему функции, затем просматривает список предоставленных библиотек и извлекает код для каждой необходимой вам функции.

Когда вы создаете статическую библиотеку, вы не делаете никаких ссылок, поэтому весь ваш скомпилированный код просто упаковывается (фактически он использует ar, но функционально он такой же, как zip) в статическую библиотеку .a , («A» означает «архив».) Поскольку отсутствует стадия связи, нет ничего, что проверяло бы, какие функции вызывает библиотека. У него просто есть «неразрешенная внешность», которая будет решена позже.

Это означает, что когда приходит время связать ваш двоичный файл, вам необходимо предоставить код (библиотеки) для всех необходимых вам функций - как функций, которые использует ваш собственный код, , так и функций, используемых всеми библиотеками, которые вы используете. необходимо .

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...