Вопрос

У меня есть статическая библиотека * .lib, созданная с использованием MSVC в Windows.Размер библиотеки составляет, скажем, 70 КБ.Затем у меня есть приложение, которое связывает эту библиотеку.Но теперь размер конечного исполняемого файла (* .exe) составляет 29 КБ, что меньше библиотеки.Что я хочу знать, так это :

  1. Поскольку библиотека статически связана, я думал, что ее следует добавить непосредственно к размеру исполняемого файла, а конечный размер exe должен быть больше этого?Выполняет ли формат Windows exe также некоторое сжатие двоичных данных?

  2. Как это для систем Linux, то есть как размеры библиотеки в linux (файл *.a / *.la) соотносятся с размером исполняемого файла linux (*.out)?

-РЕКЛАМА

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

Решение

Дополнительная бухгалтерская информация содержится в .lib файл, который не нужен для конечного исполняемого файла.Эта информация помогает компоновщику найти код для фактического связывания.Кроме того, отладочная информация может храниться в .lib файл, но не в .exe файл (я не помню, где хранится отладочная информация для objs в lib-файле, она может быть где-то в другом месте).

Другие советы

Статическая библиотека как в Windows, так и в Unix представляет собой набор файлов .obj /.o.Компоновщик просматривает каждый из этих объектных файлов и определяет, необходимо ли это программе для связывания.Если это не нужно, то объектный файл не будет включен в конечный исполняемый файл.Это может привести к созданию исполняемых файлов, размер которых меньше размера библиотеки.

Редактировать:Как указывает MSalters, в Windows компилятор VC ++ теперь поддерживает генерацию объектных файлов, которые обеспечивают связывание на уровне функций, например, см. здесь.Фактически, edit-and-continue требует этого, поскольку edit-and-continue должен иметь возможность заменять минимально возможную часть исполняемого файла.

Статическая библиотека, вероятно, содержит несколько функций, которые никогда не используются.Когда компоновщик связывает библиотеку с основным исполняемым файлом, он видит, что определенные функции никогда не используются (и что их адреса никогда не берутся и не сохраняются в указателях на функции), он просто выбрасывает код.Он также может делать это рекурсивно:если функция A() никогда не вызывается, а A() вызывает B(), но B() никогда не вызывается иным образом, она может удалить код как для A(), так и для B().В Linux происходит то же самое.

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

Вы написали: Я думал, что это должно быть добавлено непосредственно к размеру исполняемого файла, а конечный размер exe должен быть больше этого?

Наивные компоновщики работают именно таким образом - когда я занимался хобби-разработкой для систем CP / M (давным-давно), это было реальной проблемой.

Однако современные компоновщики умнее - они ссылаются только на функции, на которые ссылается исходный код, или по мере необходимости.

В дополнение к текущим ответам компоновщику разрешено удалять определения функций, если они имеют идентичный объектный код - это призвано помочь уменьшить эффект раздувания шаблонного кода.

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

@Все:Спасибо за подсказки.@Greg Hewgill - Ваш ответ был хорошим указателем.Спасибо.

Ответ, который я получил, был следующим:

1.) Во время создания библиотеки происходит следующее: если включена опция "Сохранить базу данных отладки программы" в MSVC (или что-то подобное), то эта отладочная информация увеличит размер библиотеки.но когда я статически включаю эту библиотеку и создаю исполняемый файл, компоновщик удаляет всю эту отладочную информацию из библиотеки перед повторной загрузкой exe-файла, и, следовательно, размер exe меньше, чем у библиотеки.

2.) Когда я отключил опцию "Сохранить базу данных отладки программы", я получил библиотеку, размер которой был меньше конечного исполняемого файла, что было тем, что я считал обычным в большинстве ситуаций.

-РЕКЛАМА

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