Есть (в большинстве случаев, дисконтирование интерпретируемого кода) два этапа перехода от исходного кода (что вы пишете) к исполняемому коду (то, что вы запускаете).
Первый - это компиляция, которая превращает исходный код в объектные модули.
Второе, связывание, - это то, что объединяет объектные модули вместе, чтобы сформировать исполняемый файл.
Различие проводится, среди прочего, для включения сторонних библиотек в ваш исполняемый файл без просмотра их исходного кода (например, библиотек для доступа к базе данных, сетевых коммуникаций и графических пользовательских интерфейсов) или для компиляции кода в разные языки (например, C и ассемблерный код), а затем связать их все вместе.
Когда вы статически связываете файл с исполняемым файлом, содержимое этого файла включается во время связывания. Другими словами, содержимое файла физически вставляется в исполняемый файл, который вы запустите.
Когда вы связываете динамически , в исполняемый файл включается указатель на связанный файл (например, имя файла файла), а содержимое указанного файла не включается во время ссылки , Только когда вы позже запустите исполняемый файл, эти динамически связанные файлы приобретаются, и они покупаются только в копии исполняемого файла в памяти, а не на диске.
Это в основном метод отложенного связывания. Существует даже более отложенный метод (называемый в некоторых системах поздним связыванием), который не будет вводить динамически связанный файл, пока вы на самом деле не попытаетесь вызвать функцию внутри него.
Статически связанные файлы «блокируются» для исполняемого файла во время компоновки, поэтому они никогда не изменяются. Динамически связанный файл, на который ссылается исполняемый файл, можно изменить, просто заменив файл на диске.
Это позволяет обновлять функциональность без необходимости повторного связывания кода; загрузчик пересылает ссылки каждый раз, когда вы его запускаете.
Это и хорошо, и плохо - с одной стороны, это позволяет упростить обновления и исправления ошибок, с другой - может привести к тому, что программы перестанут работать, если обновления несовместимы - это иногда является причиной страшного «ада DLL» что некоторые люди упоминают в этом, что приложения могут быть повреждены, если вы замените динамически связанную библиотеку библиотекой, которая несовместима (кстати, разработчики, которые делают это, должны ожидать, что их выследят и сурово накажут).
В качестве примера давайте рассмотрим случай, когда пользователь компилирует свой файл main.c
для статического и динамического связывания.
Phase Static Dynamic
-------- ---------------------- ------------------------
+---------+ +---------+
| main.c | | main.c |
+---------+ +---------+
Compile........|.........................|...................
+---------+ +---------+ +---------+ +--------+
| main.o | | crtlib | | main.o | | crtimp |
+---------+ +---------+ +---------+ +--------+
Link...........|..........|..............|...........|.......
| | +-----------+
| | |
+---------+ | +---------+ +--------+
| main |-----+ | main | | crtdll |
+---------+ +---------+ +--------+
Load/Run.......|.........................|..........|........
+---------+ +---------+ |
| main in | | main in |-----+
| memory | | memory |
+---------+ +---------+
В статическом случае вы можете видеть, что основная программа и библиотека времени выполнения C связаны друг с другом во время соединения (разработчиками). Поскольку пользователь обычно не может повторно связать исполняемый файл, он застрял в поведении библиотеки.
В динамическом случае основная программа связана с библиотекой импорта среды выполнения C (то, что объявляет то, что находится в динамической библиотеке, но на самом деле не определяет это). Это позволяет компоновщику связываться, даже если сам код отсутствует.
Затем во время выполнения загрузчик операционной системы выполняет позднее связывание основной программы с DLL-библиотекой времени выполнения C (динамическая библиотека ссылок или разделяемая библиотека или другая номенклатура).
Владелец среды выполнения C может в любое время добавить новую DLL-библиотеку для предоставления обновлений или исправлений ошибок. Как указывалось ранее, это имеет как преимущества, так и недостатки.