Можно ли статически связать некоторые (но не все) библиотеки с помощью libtool?
-
20-09-2019 - |
Вопрос
Я работаю над проектом, созданным с использованием autoconf, automake и libtool.Проект распространяется как в бинарном, так и в исходном виде.
В Linux по умолчанию сценарий сборки динамически связывается со всеми библиотеками.Это имеет смысл, поскольку пользователи Linux могут полагаться на менеджер пакетов своего дистрибутива для обработки зависимостей.
В Windows по умолчанию сценарий сборки статически связывается со всеми библиотеками с помощью библиотеки libtool. -all-static
вариант.Это имеет смысл, поскольку ни одна из зависимостей не поставляется с Windows, и полезно иметь возможность распространять один двоичный файл, содержащий все зависимости, а не возиться с распространением тонны DLL.
В OSX некоторые зависимости предоставляются ОС, а некоторые нет.Поэтому было бы полезно динамически связываться с библиотеками, предоставляемыми ОС, а с другими библиотеками — статически.К сожалению, libtool работает по принципу «все или ничего» -all-static
опция здесь не поможет.
Есть ли хороший способ заставить libtool ссылаться на некоторый библиотеки статически, а не все?
Примечание:Я понимаю, что мог бы тщательно скомпилировать зависимости, чтобы были доступны только статические сборки.Однако я бы предпочел, чтобы система сборки моего проекта была надежной в обычном случае статических и доступны динамические сборки зависимостей.
Примечание:Конечно, меня не интересуют действительно низкоуровневые зависимости, такие как библиотеки времени выполнения C/C++, которые всегда динамически компонуются на всех трех вышеперечисленных платформах.
Решение
После некоторых исследований я ответил на свой вопрос.
Если у вас установлены статические и динамические сборки библиотеки, и вы ссылаетесь на эту библиотеку с помощью -l
параметр, libtool предпочтительно ссылается на динамическую сборку.Он ссылается на статическую сборку, если динамическая сборка недоступна или если вы передаете -static
или -all-static
параметры.
libtool можно принудительно связать со статической библиотекой, указав полный путь к этой библиотеке вместо -l
вариант.