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

StackOverflow https://stackoverflow.com/questions/13128

  •  08-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

В 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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top