Как объединить несколько библиотек 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", который, в свою очередь, включает все, что вы хотите. Вы также можете поместить это в место, где ваш компилятор ищет библиотеки, чтобы он работал для любого проекта.


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