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

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

36
задан Community 10 September 2008 в 18:13
поделиться

5 ответов

На Unix как системы ld и утилиты площади могут сделать это. Выезд http://en.wikipedia.org/wiki/Ar_ (Unix) или поиск страницы справочника на любом поле Linux или через Google, например, 'площадь человека Unix'

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

8
ответ дан Adam Bellaire 10 October 2019 в 11:09
поделиться

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

ar x <library name>

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

ar cs <new library name> <list each extracted object file>
23
ответ дан Judge Maygarden 10 October 2019 в 11:09
поделиться

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

Т.е. это - только проблема, если код конца должен выполнить прямые вызовы в libz.a, libpng.a и т.д.

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

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

0
ответ дан Greg Whitfield 10 October 2019 в 11:09
поделиться

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

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

0
ответ дан Adam Tyszecki 10 October 2019 в 11:09
поделиться

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

-1
ответ дан tuxedo 10 October 2019 в 11:09
поделиться