Преамбула
Вы не ответили на мой комментарий об использовании файла .DEF, поэтому я предполагаю, что вы не знакомы с квалификаторами dllexport
и dllimport
. С ними нет необходимости экспортировать символы в файл .DEF.
Если существует особая необходимость в файле .DEF, который делает недействительным использование функции dllimport
/ dllexport
, игнорируйте следующее.
Как использовать dllimport
/ dllexport
?
В вашем публичном заголовке (скажем, public.hpp
) напишите что-то вроде:
#ifdef MY_PROJECT_EXPORTS
#define MY_PROJECT_API __declspec(dllexport)
#else
#define MY_PROJECT_API __declspec(dllimport)
#endif
Таким образом, макрос MY_PROJECT_API
включит экспорт / импорт ваших символов. Например, позже, в том же public.hpp
, вы можете объявить:
// A global variable
MY_PROJECT_API int myGlobalVariable ;
// A function
MY_PROJECT_API void my_function() ;
// A class or struct
class MY_PROJECT_API MyClass
{
public :
int i;
virtual int foo() ;
// etc.
} ;
Затем, в параметрах проекта вашей библиотеки вам нужно определить MY_PROJECT_EXPORTS
: таким образом, когда вы компилируете свою библиотеку, символы выше объявляются dllexport
, и когда кто-то еще включает ваш public.hpp
заголовок, символы выше будут dllimport
И если ваш код кроссплатформенный (dllimport
/ dllexport
- это функция компилятора MS), просто оберните приведенные выше определения вокруг теста компилятора. Например:
#ifdef _MSC_VER
// For MS Visual Studio
#ifdef MY_PROJECT_EXPORTS
#define MY_PROJECT_API __declspec(dllexport)
#else
#define MY_PROJECT_API __declspec(dllimport)
#endif
#else
// For other compilers
#define MY_PROJECT_API
#endif
О файле .DEF?
.DEF-файл использовался до , когда экспортируемые функции C все еще находились в процессе разработки в Visual Studio.
Для строгой безопасности типов C ++ украшает свои символы.
Недостатком является то, что у каждого компилятора есть своя собственная схема оформления (что никогда не беспокоило меня за 12 лет разработки), и что поиск точного, украшенного имени символа не может быть болезненным.
Но достоинства этого таковы:
- Теперь вы можете экспортировать перегруженные / именованные функции / символы
- типы параметров являются частью ABI, то есть компоновщик может проверить, что вы не испортили или не изменили своим типам
Функции dllimport
и dllexport
имеют следующие преимущества:
- позволяет выполнять экспорт на уровне источника вместо использования еще одного файла проекта
- теперь программист может игнорировать конкретную схему декорации (которая обычно интересует только компоновщик), в то же время получая выгоду от строгой безопасности типов C ++, распространяемой на компоновщик.
Источники
Для получения дополнительной информации см .: