Использование процедуры dllimport - PullRequest
6 голосов
/ 10 января 2011

Я пытаюсь написать DLL, вот так выглядит мой заголовочный файл:

#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


DLLIMPORT void HelloWorld (void);


#endif /* _DLL_H_ */

В файле .cpp я включаю этот заголовочный файл и пытаюсь объявить процедуру импорта DLL следующим образом:

DLLIMPORT void HelloWorld ()
{
   MessageBox (0, "Hello World from DLL!n", "Hi", MB_ICONINFORMATION);
}

Но компилятор (у меня mingw32 на Windows 7 64 бит) продолжает выдавать мне эту ошибку:

E:\Cpp\Sys64\main.cpp|7|error: function 'void HelloWorld()' definition is marked dllimport|
E:\Cpp\Sys64\main.cpp||In function 'void HelloWorld()':|
E:\Cpp\Sys64\main.cpp|7|warning: 'void HelloWorld()' redeclared without dllimport attribute: previous dllimport ignored|
||=== Build finished: 1 errors, 1 warnings ===|

И я не понимаю, почему.

Ответы [ 2 ]

3 голосов
/ 04 апреля 2014

У меня была точно такая же ошибка, прежде чем я понял, что на самом деле не определил BUILDING_DLL.

Поэтому DLLIMPORT было определено как __declspec (dllimport), а не __declspec (dllexport), как предполагалось.После того как я определил символ, проблема была решена.

Поскольку вы работаете в MinGW, вам нужно передать следующее:

-DBUILDING_DLL

в качестве опции компилятора или просто добавить

#define BUILDING_DLL

вверху вашего файла.Первое лучше, используйте решение #define, только если вы не можете понять, как передать опцию -DBUILDING_DLL в gcc.

3 голосов
/ 10 января 2011

declspec(dllimport) генерирует записи в таблице импорта модуля.Эта таблица импорта используется для разрешения ссылок на символы во время ссылки.Во время загрузки эти ссылки исправляются загрузчиком.

* declspec(dllexport) создает записи в таблице экспорта DLL DLL.Кроме того, вам необходимо реализовать символы (функции, переменные), которые объявляются с ним.

Поскольку вы реализуете DLL, вы должны определить BUILDING_DLL.Это можно сделать с помощью #define, но это лучше настроить в настройках проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...