Каково различие/отношения между "экстерном" и "__ declspec (dllimport")? Я нашел, что иногда необходимо использовать их обоих, иногда каждый достаточно.
Я исправляю это:
extern
означает, что сущность имеет внешнюю связь, т.е. видна вне своей единицы трансляции (файла C или CPP). Это означает, что соответствующий символ будет помещен в объектный файл, и, следовательно, он также будет виден, если этот объектный файл станет частью статической библиотеки. Однако extern
сам по себе не означает, что символ будет также виден, если объектный файл станет частью DLL.
__declspec(dllexport)
означает, что символ должен быть экспортирован из DLL (если он действительно является частью DLL). Он используется при компиляции кода, который входит в DLL.
__declspec(dllimport)
означает, что символ будет импортирован из DLL. Он используется при компиляции кода, который использует DLL.
Поскольку один и тот же заголовочный файл обычно используется как при компиляции самой DLL, так и клиентского кода, который будет использовать DLL, принято определять макрос, разрешающий __declspec(dllexport)
при компиляции DLL и __declspec(dllimport)
при компиляции ее клиента, следующим образом:
#if COMPILING_THE_DLL
#define DLLEXTERN __declspec(dllexport)
#else
#define DLLEXTERN __declspec(dllimport)
#endif
Чтобы ответить на ваши конкретные вопросы:
extern
достаточно для статических библиотек. extern
(см. объяснение здесь). extern
с __declspec(dllimport)
(см. объяснение по ссылке выше), но поскольку вы обычно используете один и тот же заголовочный файл, у вас уже есть extern
, потому что он нужен при компиляции DLL.