Я искал этот термин "экспорт символа". Что означает экспорт символа в C/С++ или в отношении библиотек (общий/статический)? Откуда мы экспортируем символы и почему? Какова связь экспорта символа с именем, который компилятор компилирует?
Что означает экспорт символа?
Ответ 1
Экспорт символа означает "рекламировать" его существование в вашем объектном файле/библиотеке и где он есть, чтобы он мог быть импортирован (= связан с) другими модулями.
Ссылка может быть сделана статически или динамически, но в любом случае компоновщик должен знать, что такое символ, и где он находится, и экспортированный символ и импортированный символ должны соответствовать ему. Управление именем связано с этим (сбой имени языка С++ включает определение типа символа в имени символа, а изменение экспортированного и импортированного символа должно соответствовать компоновщику, чтобы правильно связать импорт-экспорт).
Пример:
Предположим, у вас есть библиотека "STANDARDC" (случайное имя) и ваша программа SOMEPROG. Программа SOMEPROG должна печатать на консоль, поэтому она вызывается printf
. Но вы фактически не реализуете printf
в своей программе SOMEPROG, вы просто используете ее (= импортировать), а реализация - в другом месте.
В библиотеке STANDARDC есть список экспортируемых символов, который включает в себя все функции, реализованные в этой библиотеке, и их можно вызывать извне (= экспортированные функции). printf
- одна из таких функций, поэтому она будет отображаться в экспортированном списке.
Компилятор проходит через ваш SOMEPROG.C и видит, что вы ссылаетесь на printf
, но для него нет реализации. Компилятор добавляет printf
в список импортированных символов для результирующего файла SOMEPROG.obj, чтобы компоновщик связал фактическую реализацию.
Компонент принимает ваш файл SOMEPROG.obj и файл STANDARDC.lib и видит, какие функции используются в SOMEPROG.obj. Линкер обнаруживает, что printf
не реализован, он импортируется, поэтому компоновщик просматривает все файлы .lib, которые он имеет, и находит соответствие printf
в экспортированном списке STANDARDC. Он берет реализацию printf
от STANDARDC и связывает ее с вашей программой везде, где вы ссылаетесь на импортированный символ printf
.