Разница в размерах между статической и динамической (отладочной) библиотекой и влияние на конечный файл - PullRequest
7 голосов
/ 06 января 2011

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

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

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

Ответы [ 4 ]

4 голосов
/ 06 января 2011

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

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

В предварительно собранной библиотеке, которую я получаю с boostpro.com, я не получаю.pdb файлы для расширенных 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.

3 голосов
/ 06 января 2011

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

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

1 голос
/ 06 января 2011

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

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

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

0 голосов
/ 06 января 2011

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

...