Как объединить несколько библиотек C / C ++ в одну? - PullRequest
35 голосов
/ 16 августа 2008

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

Ответы [ 6 ]

23 голосов
/ 16 августа 2008

Вы можете извлечь объектные файлы из каждой библиотеки с помощью

ar x <library name>

, а затем объединить их в новую библиотеку с

ar cs <new library name> <list each extracted object file>
8 голосов
/ 16 августа 2008

В Unix-подобных системах утилиты ld и ar могут делать это. Проверьте http://en.wikipedia.org/wiki/Ar_(Unix) или посмотрите справочные страницы на любом компьютере с Linux или через Google, например, 'unix man ar'.

Обратите внимание, что вам лучше связываться с общей (динамической) библиотекой. Это добавит зависимость к вашему исполняемому файлу, но значительно уменьшит его размер, особенно если вы пишете графическое приложение.

3 голосов
/ 28 декабря 2014

В 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
0 голосов
/ 28 августа 2008

Объединение нескольких сторонних библиотек в одну может создать для вас больше проблем, например, если две из этих библиотек определяют общий символ, который ваша программа не использует. Теперь вам нужно извлечь все (или все, кроме одного) экземпляров общего символа, прежде чем объединять библиотеки.

0 голосов
/ 22 августа 2008

Может быть, я неправильно понимаю, но разве вам не нужно отправлять библиотеки, если код конечного пользователя вызывает их напрямую? Если весь доступ к методам Jpeg и т. Д. Осуществляется из вашего кода в вашей статической библиотеке, то просто свяжите библиотеки в вашу библиотеку.

* 1003 Т.е. *

----------------
| 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: Получу ли я значок художника? :)

0 голосов
/ 16 августа 2008

Я не уверен, как физически объединить их в один файл, однако вы могли бы использовать своего рода абстракцию и просто включить один «AllMyLibs.a / h», который, в свою очередь, включает в себя все, что вы хотите. Вы также можете поместить это в место, где ваш компилятор ищет библиотеки, чтобы оно работало для любого проекта.

P.S. - Из любопытства, почему вы не любите в том числе одиноких библиотек?

...