C / C ++. Преимущества библиотек перед объединенными объектными файлами - PullRequest
9 голосов
/ 05 июня 2011

Хотя объединение нескольких объектных файлов в библиотеке является обычным делом, возможно (по крайней мере в Linux) объединить несколько объектных файлов в другой объектный файл.

(См. объединение двух скомпилированных GCC объектных файлов .o в третий файл .o )

Поскольку есть недостатки в использовании библиотек вместо просто комбинированных объектных файлов:

1: при связывании легче работать только с одним типом файла (объекта), особенно если все файлы выполняют одно и то же.

2: При компоновке (по крайней мере, в GCC) библиотеки (по умолчанию) должны быть упорядочены и не могут обрабатывать циклические зависимости.

Я хочу знать, какие преимущества есть у библиотек (кроме уловки 22, которую они много используют).

После некоторого поиска единственное объяснение, которое я получаю, состоит в том, что отдельные библиотеки лучше, чем несколько объектных файлов.

Ответы [ 4 ]

10 голосов
/ 05 июня 2011

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

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

5 голосов
/ 05 июня 2011

Обычно библиотека лучше, так как компоновщик может оптимизировать неиспользуемые файлы .o в библиотеке.

Комбинирование файлов каким-то образом также имеет некоторые преимущества:

  • Если объединить все исходные файлы в один, то это значительно увеличивает скорость компиляции.компоновщик может оптимизировать .o файл, который вы не хотите оптимизировать.Например, когда вам нужны побочные эффекты конструкторов объектов, определенных там, но не используемых ни в одной другой единице перевода.
1 голос
/ 05 июня 2011

Если вы используете объектные файлы, то весь код в объектном файле помещается в ваше приложение.Если вы используете библиотеки, то только необходимый код:.

0 голосов
/ 05 июня 2011

Одной из причин является то, что объекты в библиотеке .a будут извлечены только для удовлетворения неопределенных ссылок на символы - поэтому, если вы хотите, чтобы вызывающее приложение могло определить символ или использоватьопределение по умолчанию в коде «библиотеки», это можно сделать с реальной библиотекой, но не с одним .o файлом.

...