Как я могу исправить это vs10 несовместимое предупреждение об установке DLL?

У меня есть ряд предупреждений, которые я пытаюсь исправить при создании 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

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

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

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