Я устал добавлять в свой проект десять библиотек ссылок или требовать, чтобы восемь из них использовали мои собственные. Я хотел бы использовать существующие библиотеки, такие как libpng.a, libz.a, libjpeg.a, и объединить их в одну библиотеку .a. Это возможно? Как насчет объединения библиотек .lib?
Как объединить несколько библиотек C/С++ в один?
Ответ 1
В Unix-подобных системах утилиты ld и ar могут это сделать. Проверьте http://en.wikipedia.org/wiki/Ar_(Unix) или найдите man-страницы в любом Linux-окне или через google, например, unix man ar.
Обратите внимание, что вам может быть лучше связать с общей (динамической) библиотекой. Это добавит зависимость от вашего исполняемого файла, но значительно уменьшит его размер, особенно если вы пишете графическое приложение.
Ответ 2
Вы можете извлечь объектные файлы из каждой библиотеки с помощью
ar x <library name>
а затем объединить их все в новую библиотеку с
ar cs <new library name> <list each extracted object file>
Ответ 3
В 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:
lib.exe /OUT:libab.lib liba.lib libb.lib
Ответ 4
Я не уверен, как физически объединить их в один файл, однако вы можете использовать абстракцию и просто включить один "AllMyLibs.a/h", который, в свою очередь, включает в себя все, что вы хотите. Вы также можете поместить это в место, где ваш компилятор ищет библиотеки, поэтому он будет работать для любого проекта.
P.S. - Из любопытства, почему вы не любите, включая отдельные библиотеки?
Ответ 5
Возможно, я недопонимаю, но разве вам не нужно отправлять файлы только в том случае, если код конечного пользователя вызывает их напрямую? Если весь доступ к Jpeg-методам и т.д. Из вашего кода в вашей статической библиотеке, просто свяжите libs с вашим lib.
т.е.
----------------
| End-user exe |
----------------
|
| makes calls to
|
v
--------------------
| Your static lib.a |
--------------------
| makes calls to and links
v
------------------------------------ .....
| | |
------------- -------- ----------
| libjpeg.a | |libz.a| |libpng.a|
------------- -------- ----------
I. Это только проблема, если конечный код должен делать прямые вызовы в libz.a, libpng.a и т.д.
Если код приложения имеет законную потребность вызвать libz.a, например, то, как упомянуто выше, будет случай использования динамического модуля.
PS: Я получаю значок артистов?:)
Ответ 6
Объединение нескольких сторонних библиотек в один может создать для вас больше проблем - например, если две из этих библиотек определяют общий символ, который ваша программа не использует. Теперь вы должны извлечь все (или все-но) экземпляры общего символа перед объединением библиотек.
Ответ 7
Вы можете попробовать эту библиотеку:
#include<bits/stdc++.h>
если есть почти все библиотеки в С++!