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

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

16.08.2008 13:46:01
6 ОТВЕТОВ
РЕШЕНИЕ

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

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

8
30.10.2008 01:04:32
Почему меньший размер изображения лучше в графических приложениях?
ds-bos-msk 29.12.2013 19:15:23
Меньший размер изображения обычно лучше. Графические библиотеки (xlib et. Al.) Имеют тенденцию быть очень большими и поэтому делают очень большие исполняемые файлы, если связаны статически.
Avner 30.12.2013 06:28:30
Ооо, так вы имели в виду приложения с графическим интерфейсом. Я думал, что вы имеете в виду графику, как в 3D движках с графическими шейдерами и прочим ...
ds-bos-msk 1.01.2014 10:43:25
Да, я имел в виду GUI как библиотеки.
Avner 1.01.2014 13:59:57

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

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

0
25.11.2016 16:34:34

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

ar x <library name>

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

ar cs <new library name> <list each extracted object file>
25
16.08.2008 16:18:30
Это не работает на всех ар. Читая руководство, я обнаружил, что в более ранних версиях ar это проще сделать: sh4-linux-ar r <existinglib.a> *.oдобавить другие символы кexistinglib.a
Edu Felipe 4.08.2010 20:32:32
Это также может вызвать проблемы для длины командной строки. Компиляция файлов .a / .lib часто используется, чтобы обойти ограничение WIN32 в 4096 символов в командной строке (не может быть слишком много .o для одновременной компоновки или создания библиотеки).
whitey04 17.08.2011 20:22:24
Имейте в виду, что если две ваши библиотеки содержат члены с одинаковыми именами, то наивный подход unpack-library-into-directory-and-repack не удастся - все члены будут потеряны. Вам нужно будет переименовать одного из участников, чтобы избежать столкновения.
David Given 5.06.2013 14:46:57

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

0
22.08.2008 10:32:09
Нет, вы не создаете ссылки при создании «вашего статического lib.a». Связывание выполняется только при создании окончательного исполняемого файла. Именно поэтому вопрос был задан.
Trent 22.05.2009 22:01:11
Прости, Трент, ты не прав. Связывание относится к библиотекам, а не только к EXE.
Greg Whitfield 18.05.2010 11:54:20
@Greg; Трент прав. Создание библиотеки - это просто помещение объектных файлов в архив с таблицей символов. Нет компилятора (cc) или компоновщика (ld), только инструмент архиватора (ar).
whitey04 19.08.2011 22:15:10
@ whitey04: Строго говоря, вы правы или конечно. Но я говорил о более слабом смысле использования библиотек в качестве входных данных для других библиотек. По крайней мере, я был изначально, хотя мой комментарий к Тренту может противоречить этому - между ними были месяцы, в конце концов ... Может быть, мне следовало сказать «звонит и ссылается» на моей диаграмме. Я стесняюсь цитировать Википедию - мы знаем, насколько это может быть надежно;) - но посмотрите изображение на этой странице, чтобы увидеть, к чему я клонил - en.wikipedia.org/wiki/Linker_(computing)
Greg Whitfield 27.08.2011 17:44:33
Я знаю, что это старая дискуссия, но недавно я столкнулся с тем же, и мне нужно идти с Трентом. Я построил статическую библиотеку, которая делает вызовы glib(также статическую библиотеку). Но ничего из glib не было включено в мой библиотечный файл, вызовы просто остаются нерешенными. Если вы попытаетесь связаться с моей библиотекой без ссылки glib, эти неразрешенные вызовы приведут к сбою компоновщика. Я мог бы использовать arдля упаковки glibи мою библиотеку в одно целое, но это почти наверняка плохая идея (в конечном итоге приведет к дублированию определений для кого-то) и сделает мою библиотеку огромной.
brianmearns 29.10.2013 12:37:45

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

-2
28.08.2008 02:58:33

В 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
6
15.08.2017 13:13:26
Не могли бы вы подробнее рассказать о наборе инструментов MSCV в пошаговом режиме? Поблагодарить.
javaLover 29.03.2017 02:06:03
@javaLover Я бы хотел, но извините, у меня сейчас нет ПК с Windows.
Star Brilliant 30.03.2017 05:10:04