Разница в размерах между статической и динамической (отладочной) библиотекой и влияние на окончательный exe-файл
-
26-09-2019 - |
Вопрос
Я никогда особо не задумывался о разнице в размерах между статической и динамической библиотекой, пока сегодня не скачал готовые библиотеки 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-файлы, которые используются.
Отладка статической библиотеки содержит информацию отладки, которая объясняет огромную разницу размера.