Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как влияет статическая и динамическая линковка на размер приложения?

#cpp #windows #visual_studio


Как именно влияет статическая и динамическая линковка с .dll\.lib на размер приложения?
    


Ответы

Ответ 1



При динамической компоновке используются динамические же библиотеки. Они имеют расширение .dll и ничем по внутренней структуре не отличаются от исполняемого .exe-файла. Когда компоновщик имеет дело с динамической библиотекой, то он не берёт оттуда никаких кусков кода (чревато, ибо код машинный), а просто вставляет в компилируемую программу указания типа: «При загрузке программы разместить в указанном месте оперативной памяти адрес функции по имени «XXX» из библиотеки «YYY». Статическая же библиотека (.lib-файл) — это просто архив с объектными файлами внутри. А компоновщику абсолютно без разницы, чьи объектные файлы использовать при компиляции — из родного проекта или из какого-то внешнего источника (необязательно даже статической библиотеки, отдельно лежащий объектный файл тоже сгодится). Если эти файлы особым образом подготовлены, то включаются только используемые функции (если особым образом помечены границы функций) или даже выполняются так называемые межмодульные оптимизации (если вместо машинного кода использовано высокоуровневое представление). При отсутствии же подобной подготовки будет включено всё содержимое статической библиотеки, даже неиспользуемое. Для тех, кто не понял, о чём речь: компилятор и компоновщик — это две различные, хоть и последовательно работающие, программы. Первая преобразует каждый .cpp файлы в полуфабрикатный объектный файл, а вторая собирает объектные файлы в итоговый исполняемый файл.

Ответ 2



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

Комментариев нет:

Отправить комментарий