Как я могу скомпилировать проект autotools со статически связанными зависимостями?
Есть библиотека с открытым исходным кодом, которую я хочу использовать. Поскольку я хочу распространять свое программное обеспечение в виде двоичного пакета, я не хочу, чтобы библиотека имела зависимости от других библиотек, поэтому мне нужно статически связывать зависимости.
Теперь, когда библиотека имеет открытый исходный код и не содержит двоичных файлов, я сам ее скомпилирую. Библиотека использует автоинструменты, и я не нашел никакой полезной документации о том, как статически связывать зависимости. Я попытался вызвать скрипт configure с параметром --enable-static, но это, очевидно, говорит только о том, что configure скомпилирует статическую версию библиотеки, но мне нужна динамическая библиотека, включающая все библиотеки, от которых она зависит.
Итак, мне нужен либо способ настроить configure для статической ссылки на зависимости, либо способ постобработки встроенной библиотеки для включения всех зависимостей. Может кто-нибудь сказать мне, как это сделать?
Да, и если это имеет значение: я на 64-битном Snow Leopard.
2 ответа
Недавно, пройдя этот путь самостоятельно, я обнаружил, что, к сожалению, статические библиотеки на самом деле не работают таким образом.
Когда вы создаете статический исполняемый двоичный файл, компоновщик просматривает все необходимые ему функции, затем просматривает список предоставленных библиотек и извлекает код для каждой необходимой вам функции.
Когда вы создаете статическую библиотеку, вы не делаете никаких ссылок, поэтому весь ваш скомпилированный код просто заархивирован (на самом деле он использует ar
но функционально это так же, как почтовый индекс) в .a
статическая библиотека. ("A" означает "архив".) Поскольку нет стадии связывания, нет ничего, что проверяло бы, какие функции вызывает библиотека. У него просто есть куча "неразрешенных внешних факторов", которые будут решены позже.
Это означает, что когда приходит время связать ваш двоичный файл, вам необходимо предоставить код (библиотеки) для всех необходимых вам функций - как функций, которые использует ваш собственный код, так и функций, используемых всеми необходимыми библиотеками.
Я абсолютно понимаю, почему вы хотите создать библиотеку со всеми вашими зависимостями, но, насколько я могу судить, она не работает так. Вот почему есть такие программы, как pkg-config
, который вы можете использовать для информирования пользователей вашей (статической или динамической) библиотеки о том, с какими зависимыми библиотеками они должны связываться, чтобы использовать вашу.
Наконец, убедитесь, что вы проверили лицензию любой библиотеки, с которой хотите связать. Тот факт, что библиотека имеет открытый исходный код, не означает, что вам не сойдутся ссылки на нее. Если это библиотека GPL, то, ссылаясь на нее, вы соглашаетесь выпустить свой собственный исходный код под лицензией GPL, чего вы, возможно, не захотите делать.
Если вы получили .a файл библиотеки, вы можете попробовать добавить следующее в Makefile.am вашего проекта.
yourproject_LDADD = libxxx.a