Title.ru

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

Ответов (6)

Решение

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

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

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

В 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

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

PS - Из любопытства, почему вы не любите включать одиночные библиотеки?

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

ar x <library name>

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

ar cs <new library name> <list each extracted object file>

Возможно, я неправильно понимаю, но разве вам не нужно отправлять библиотеки только в том случае, если код конечного пользователя вызывает их напрямую? Если весь доступ к методам 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: Получу ли я значок художника? :)