Как объединить несколько библиотек C/C++ в одну?
Я устал добавлять десять библиотек ссылок в свой проект или требовать, чтобы восемь из них использовали мои собственные. Я хотел бы взять существующие библиотеки libpng.а сайт libz.a, libjpeg.а, и объединить их в один .библиотека. Это возможно? Как насчет объединения .Либ библиотек?
6 ответов
в Unix подобных системах утилиты ld и ar могут это сделать. Проверьтеhttp://en.wikipedia.org/wiki/Ar_ (Unix) или поиск man-страниц в любом окне linux или через google, e.g 'unix man ar'.
обратите внимание, что вам может быть лучше связать с общей (динамической) библиотекой. Это добавит зависимость к исполняемому файлу, но значительно уменьшит его размер, особенно если вы пишете графическое приложение.
вы можете извлечь объектные файлы из каждой библиотеки с помощью
ar x <library name>
а затем объединить их все в новую библиотеку с
ar cs <new library name> <list each extracted object file>
на Linux или MinGW или Cygwin, с GNU toolchain:
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 toolchain:
lib.exe /OUT:libab.lib liba.lib libb.lib
может быть, я неправильно понял, но разве вам не нужно только отправлять библиотеки, если код конечного пользователя вызывает их напрямую? Если весь доступ к методам Jpeg и т. д. Из вашего кода в вашей статической библиотеке, просто свяжите библиотеки в lib.
т. е.
----------------
| End-user exe |
----------------
|
| makes calls to
|
v
--------------------
| Your static lib.a |
--------------------
| makes calls to and links
v
------------------------------------ .....
| | |
------------- -------- ----------
| libjpeg.a | |libz.a| |libpng.a|
------------- -------- ----------
т. е. это только проблема, если end-код должен совершать прямые вызовы в libz.a, libpng.a etc.
если код приложения имеет законную необходимость вызвать libz.а, например, тогда что бы как упоминалось выше используйте динамический модуль.
PS: я получаю значок художника? :)
Я не уверен, как физически объединить их в один файл, однако вы можете использовать абстракцию и просто включить один "AllMyLibs.a / h", который, в свою очередь, включает все, что вы хотите. Вы также можете поместить это в место, где ваш компилятор ищет библиотеки, чтобы он работал для любого проекта.
объединение нескольких сторонних библиотек можно создать больше проблем для вас-например, если две из этих библиотек определяют общий символ, который ваша программа не использует. Теперь вам нужно извлечь все (или все, кроме одного) экземпляры общего символа перед объединением библиотек.