Подтвердить что ты не робот

Как объединить несколько библиотек C/С++ в один?

Я устал добавлять в свой проект десять библиотек ссылок или требовать, чтобы восемь из них использовали мои собственные. Я хотел бы использовать существующие библиотеки, такие как libpng.a, libz.a, libjpeg.a, и объединить их в одну библиотеку .a. Это возможно? Как насчет объединения библиотек .lib?

4b9b3361

Ответ 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>

если есть почти все библиотеки в С++!