Как объединить несколько библиотек C / C ++ в одну?
Вопрос
Я устал добавлять в свой проект десять библиотек ссылок или требовать, чтобы восемь из них использовали мою собственную.Я бы хотел взять существующие библиотеки, такие как libpng.a, libz.a, libjpeg.a, и объединить их в одну библиотеку .a.Возможно ли это?Как насчет объединения библиотек .lib?
Решение
В Unix-подобных системах это могут делать утилиты ld и ar.Проверьте http://en.wikipedia.org/wiki/Ar_ (Unix) или найдите справочные страницы в любом окне Linux или через Google, например, "unix man ar".
Пожалуйста, обратите внимание, что, возможно, вам было бы лучше создать ссылку на общую (динамическую) библиотеку.Это добавило бы зависимость к вашему исполняемому файлу, но значительно уменьшило бы его размер, особенно если вы пишете графическое приложение.
Другие советы
Вы могли бы извлечь объектные файлы из каждой библиотеки с помощью
ar x <library name>
а затем объедините их все в новую библиотеку с помощью
ar cs <new library name> <list each extracted object file>
На Linux, MinGW или Cygwin, с набором инструментов GNU:
ar -M <<EOM
CREATE libab.a
ADDLIB liba.a
ADDLIB libb.a
SAVE
END
EOM
ranlib libab.a
Или если вы сможете сохранить существование liba.a
и libb.a
:
ar crsT libab.a liba.a libb.a
В Windows, с помощью набора инструментов MSVC:
lib.exe /OUT:libab.lib liba.lib libb.lib
Возможно, я неправильно понимаю, но разве вам не нужно отправлять библиотеки только в том случае, если код конечного пользователя вызывает их напрямую?Если весь доступ к методам Jpeg и т.д. Осуществляется из вашего кода в вашей статической библиотеке, то просто привяжите библиотеки к вашей библиотеке.
То есть.
----------------
| End-user exe |
----------------
|
| makes calls to
|
v
--------------------
| Your static lib.a |
--------------------
| makes calls to and links
v
------------------------------------ .....
| | |
------------- -------- ----------
| libjpeg.a | |libz.a| |libpng.a|
------------- -------- ----------
Т.е. это проблема только в том случае, если конечному коду необходимо выполнять прямые вызовы в libz.a, libpng.a и т.д.
Например, если в коде приложения есть законная необходимость вызвать libz.a, то это, как упоминалось выше, было бы уместно для использования динамического модуля.
PS:Получу ли я значок артиста?:)
Я не уверен, как физически объединить их в один файл, однако вы могли бы использовать своего рода абстракцию и просто включить один "AllMyLibs.a / h", который, в свою очередь, включает все, что вы хотите.Вы также могли бы поместить это в папку, где ваш компилятор выполняет поиск библиотек, чтобы это работало для любого проекта.
P.S.- Из любопытства, почему вам не нравится включать отдельные библиотеки?
Объединение нескольких сторонних библиотек в одну может создать для вас больше проблем - например, если две из этих библиотек определяют общий символ, который ваша программа не использует.Теперь вам нужно извлечь все (или все, кроме одного) экземпляры общего символа, прежде чем объединять библиотеки.