Что означает экспорт символа?

Я искал этот термин "экспорт символа". Что означает экспорт символа в 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.