2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Компоновщик играет жизненно важную роль в разработке программ. Он отвечает за интеграцию нескольких объектных файлов и файлов библиотек в исполняемый файл. Прежде чем мы углубимся в то, как работает компоновщик, в разницу между статическим и динамическим связыванием, а также в то, как создавать и использовать библиотеки динамической компоновки, давайте сначала обрисуем основные функции компоновщика.
Линкер Это инструмент, отвечающий за объединение одного или нескольких объектных файлов и файлов библиотек в исполняемый файл. К его основным функциям относятся:
Разбор символов : Идентифицировать и обрабатывать все символы (имена функций и переменных) в программе, гарантируя, что каждый символ имеет уникальное определение. Для символов, на которые имеются ссылки, но которые не определены (внешние символы), компоновщик ищет определение в предоставленной библиотеке или другом объектном файле.
перезагрузить : Скорректируйте адреса кода и данных в каждом модуле в соответствии с конечным адресом памяти. Перемещение включает в себя коррекцию адреса в коде и корректировку положения сегмента данных, чтобы гарантировать, что все ссылки указывают на правильную ячейку памяти.
объединить сегменты: объединить сегменты одного типа (например, сегменты кода, сегменты данных и т. д.) из разных целевых файлов в один непрерывный сегмент.
библиотека обработки : Свяжите код библиотеки, необходимый программе, с объектным файлом. Компоновщик может обрабатывать два типа библиотек: статические библиотеки и динамические библиотеки.
Создать исполняемый файл: Конечным результатом является исполняемый файл, который можно запустить в операционной системе.
Статическое связывание иДинамическое связывание Это два режима работы компоновщика, каждый из которых имеет разные характеристики и сценарии использования.
концепция : при статическом связывании код библиотеки копируется во время компиляции и встраивается в каждый исполняемый файл, который его использует. Таким образом, сгенерированный исполняемый файл содержит весь необходимый код и не зависит от файлов внешних библиотек.
преимущество:
недостаток:
Расширение статической библиотеки:
.lib
.a
концепция : при динамическом связывании код библиотеки загружается во время выполнения и не внедряется в исполняемый файл. Исполняемый файл содержит только ссылки на библиотеки, а код библиотеки загружается операционной системой во время выполнения.
преимущество:
недостаток:
Расширение динамической библиотеки:
.dll
(Динамическая библиотека).so
(Общий объект)В разных операционных системах методы создания динамически подключаемых библиотек немного отличаются. Вот некоторые общие шаги и команды:
Написать код библиотеки:
Создайте исходный файл C, содержащий функции, которые мы хотим поместить в динамическую библиотеку.
// example.cpp
#include