Как я могу исправить это vs10 несовместимое предупреждение о связи DLL? - PullRequest
10 голосов
/ 17 марта 2011

У меня есть ряд предупреждений, которые я пытаюсь исправить при сборке gdcm с использованием Visual Studio 10 (32-разрядная версия):

4>..\..\..\..\gdcm\Utilities\gdcmexpat\lib\xmlparse.c(647): warning C4273: 'XML_ParserCreate' : inconsistent dll linkage
4>          d:\src\gdcm\gdcm\utilities\gdcmexpat\lib\expat.h(206) : see previous definition of 'XML_ParserCreate'

Сам вызов функции выглядит так:

XML_Parser XMLCALL
XML_ParserCreate(const XML_Char *encodingName)
{
   return XML_ParserCreate_MM(encodingName, NULL, NULL);
}

, где

#define XMLCALL __cdecl

и

XMLPARSEAPI(XML_Parser)
XML_ParserCreate(const XML_Char *encoding);

, где

#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL

и

#define XMLIMPORT __declspec(dllimport)

Если я читаю это правильно, это означает, что связь последовательно __cdecl через XMLCALL-- правильно? Потому что, если это так, то предупреждение является излишним, или я неправильно это понимаю?

1 Ответ

16 голосов
/ 17 марта 2011

Нет, он жалуется на то, что __declspec(dllimport) отсутствует в определении функции, но присутствует в объявлении функции. Вы должны относиться к этому серьезно, не имеет смысла объявлять функцию, импортированную из DLL, но также присутствует в вашем коде. Вы не можете иметь это в обоих направлениях.

Обычно это вызвано отсутствием #define. Я думаю, что вы отредактировали определения макросов, но при сборке DLL вы обычно указываете макрос в команде сборки (/ D). Так что объявление функции использует dllexport вместо dllimport. Что гарантирует, что функция будет экспортирована из DLL. Код клиента использует тот же файл .h, но создается без определения этого макроса. Он видит функцию, объявленную как dllimport.

Присмотритесь к определению макроса XMLIMPORT, __declspec(dllexport) должно быть близко. Другая диагностика - это набор экспортируемых функций, видимый с помощью Dumpbin.exe / exports. Они должны отсутствовать, если я правильно угадал.

...