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

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

6 ответов

Решение

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

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

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

ar x <library name>

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

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

В 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 - Из любопытства, почему вы не любите в том числе одиноких библиотек?

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

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

Вы можете попробовать эту библиотеку:

#include<bits/stdc++.h>

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

Другие вопросы по тегам