Представьте себе, что:
Вы дизайнер библиотеки (DLL). Вы должны определить, что должна делать библиотека ... и после этого вы пишете это. Многие процессы могут использовать ваши функции из этой библиотеки DLL, в вашей памяти есть один фрагмент памяти.
Когда вы включаете эту библиотеку в свой проект (например, в c ++), вы должны добавить некоторую информацию о функциях в этой DLL.
Первый вариант:
Вы можете объявить некоторые интерфейсы библиотечных функций (тогда ваш компоновщик счастлив;)).
Например: __declspec (dllexport) int my_function (char *);
После этого имена экспортируемых объектов завершаются в вашей программе (linker job;)) ... но
Имена этих объектов зависят от языка, компилятора, бла-бла-бла
Второй вариант:
Вы добавляете в проект вашей библиотеки некоторую информацию для компоновщика (файл * .def). Этот файл состоит из двух разделов: БИБЛИОТЕКА и РАЗДЕЛЫ. БИБЛИОТЕКА - это внутреннее имя вашей библиотеки:
БИБЛИОТЕКА my_lib
В разделе ЭКСПОРТ находятся символы, которые можно экспортировать из библиотеки.
ЭКСПОРТ
function1
function2
function3
Как видите, у этих функций нет типов, формальных параметров и т. Д. Когда вы включаете эту библиотеку, у вас нет информации о функции.
Когда вы делаете это (файл .def) и компилируете свою библиотеку, у вас есть файлы .dll и .lib. Второй файл можно использовать для связи библиотеки во время выполнения.
Если вы хотите проверить экспорт в этой библиотеке, вы можете использовать "Dependecny Walker" или "dumpbin":
свалка my.dll / экспорт
Далее вы можете загрузить эту библиотеку:
первый вариант: __declspec (dllimport) int my_function (char *);
или
второе: HMODULE LoadLibrary (LPCSTR lpszLibName);
заключение: использование экспорта может создать более универсальную библиотеку (но более сложную)
(извините за мой очень плохой английский: /)