Сведения о вопросе

Drake

15:38, 8th August, 2020

Теги

c++   c   archive    

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

Просмотров: 527   Ответов: 6

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



  Сведения об ответе

PROGA

04:34, 3rd August, 2020

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

ar x <library name>

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

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


  Сведения об ответе

qwerty101

04:43, 21st August, 2020

По Unix подобных систем, ЛД и РД Utilities может сделать это. Проверить http://en.wikipedia.org/wiki/Ar_(Unix) или просмотра Man-страниц на любом поле linux или через Google, электронной.г 'unix человек АР'.

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


  Сведения об ответе

KOMP

20:00, 2nd August, 2020

На 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


  Сведения об ответе

piter

09:03, 13th August, 2020

Может быть, я неправильно понимаю, но разве вы не должны отправлять библиотеки только в том случае, если код конечного пользователя вызывает их напрямую? Если весь доступ к Jpeg методам и т. д. осуществляется из вашего кода в статической библиотеке, то просто свяжите библиотеки с вашей библиотекой lib.

I.e.

----------------
| End-user exe |
----------------
      |
      | makes calls to
      |
      v
 --------------------
 | Your static lib.a | 
 --------------------
         | makes calls to and links
         v
     ------------------------------------ .....
     |                    |         |
  -------------    -------- ---------- 
  | libjpeg.a |    |libz.a| |libpng.a|
  -------------    -------- ----------

I.e это только проблема, если конечному коду нужно сделать прямые вызовы в libz.a, libpng.a и т. д.

Если код приложения имеет законную потребность вызвать libz.a, например, то это, как уже упоминалось выше, будет иметь место для использования динамического модуля.

PS: получу ли я значок художника? :)


  Сведения об ответе

PROGA

16:57, 15th August, 2020

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

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


  Сведения об ответе

ITSME

09:25, 13th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться