Страницы

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

вторник, 18 декабря 2018 г.

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

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


Ответ

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

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

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

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