Разница в размерах между статической и динамической (отладочной) библиотекой и влияние на окончательный exe-файл

StackOverflow https://stackoverflow.com/questions/4612783

Вопрос

Я никогда особо не задумывался о разнице в размерах между статической и динамической библиотекой, пока сегодня не скачал готовые библиотеки boost.Я обнаружил, что статические библиотеки Boost намного больше, чем динамические библиотеки.

Например, отладочная многопоточная статическая библиотека Boost Wave: 97.7 mb по размеру, а та же библиотека, но динамическая, всего 1.4 mb по размеру (включая библиотеку импорта и dll)!Это огромная разница. Почему это?

Второй вопрос: если я статически ссылаюсь, скажем, на wave библиотека.Означает ли это, что размер моего исполняемого файла превысит 97.7 mb?

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

Решение

Статические библиотеки содержат полную информацию о символах отладки.Для DLL эта информация будет находиться в файлах .pdb (которые, как я предполагаю, будут аналогичны размеру статических библиотек).

Когда вы ссылаетесь на статическую библиотеку, информация о символах не будет копироваться в .exe — она будет помещена в файл .pdb (если ваша сборка настроена на создание файла .pdb).Файл .pdb не обязательно распространять вместе с .exe, независимо от того, создан ли .pdb.

В загрузке предварительно созданной библиотеки, которую я получаю с сайта boostpro.com, я не получаю файлы .pdb для предоставляемых ими библиотек Boost DLL.если вы создадите библиотеки DLL самостоятельно, вы, вероятно, получите файлы .pdb (хотя вам, возможно, придется установить какой-то параметр конфигурации, подробности которого я понятия не имею).


обновлять:

Похоже, я ошибаюсь насчет легкого получения файлов .pdb для повышающих DLL.От http://comments.gmane.org/gmane.comp.lib.boost.build/23246:

> Is there an additional option that I can pass on the command line to
> have the (correctly generated) PDB files also copied into the stage
> directory?

Не в это время.Вы можете только взломать tools/build/v2/tools/package.jam добавить <install-type>PDB везде где <install-type>SHARED_LIB или <install-type>STATIC_LIB сейчас написано.

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

Нет, только потому, что файл lib - это определенный размер, не означает, что он добавит этот размер на ваш exe. На самом деле, большинство линкеров достаточно умны, чтобы связать только в использовании вещей. Сравните это с динамической библиотекой, которая должна содержать все.

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

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

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

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

Отладка статической библиотеки содержит информацию отладки, которая объясняет огромную разницу размера.

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