Я считаю, что эта проблема возникает только при использовании предварительно скомпилированных двоичных файлов libxml2, подготовленных Игорем Златовичем.Я подозреваю, что проблема исчезнет, если использовать libxml2 lib, изначально скомпилированную с mingw.
Вот объявление xmlFree в libxml / globals.h:
#else /* !LIBXML_THREAD_ALLOC_ENABLED */
XMLPUBVAR xmlMallocFunc xmlMalloc;
XMLPUBVAR xmlMallocFunc xmlMallocAtomic;
XMLPUBVAR xmlReallocFunc xmlRealloc;
XMLPUBVAR xmlFreeFunc xmlFree;
XMLPUBVAR xmlStrdupFunc xmlMemStrdup;
#endif /* LIBXML_THREAD_ALLOC_ENABLED */
и XMLPUBVAR расширяется на
#define XMLPUBVAR __declspec(dllimport) extern
из libxml / xmlexports.h
Первое наблюдение.xmlFree - это не функция, а переменная.Это исключительный случай, так как почти все другие функции libxml2 являются реальными экспортируемыми функциями.Это объясняет, почему xmlFree () является единственной проблемной функцией, с которой сталкиваются люди.
компилятор mingw меняет имя импортированного символа с xmlFree на _imp__xmlFree, которого нет в libxml2.lib.Я предполагаю, что с другими компиляторами, такими как MSVC, компоновщик вместо этого ищет правильный символ _xmlFree, найденный внутри libxml2.lib:
C:\MinGW\msys\1.0\home\100517891\embedded\ext\libxml2\lib>"c:\Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe" /exports libxml2.lib | grep xmlFree
_xmlFree
_xmlFreeAttributeTable
_xmlFreeAutomata
_xmlFreeCatalog
_xmlFreeDoc
_xmlFreeDocElementContent
_xmlFreeDtd
_xmlFreeElementContent
_xmlFreeElementTable
_xmlFreeEntitiesTable
_xmlFreeEnumeration
_xmlFreeIDTable
_xmlFreeInputStream
_xmlFreeMutex
_xmlFreeNode
_xmlFreeNodeList
_xmlFreeNotationTable
_xmlFreeNs
_xmlFreeNsList
_xmlFreeParserCtxt
_xmlFreeParserInputBuffer
_xmlFreePattern
_xmlFreePatternList
_xmlFreeProp
_xmlFreePropList
_xmlFreeRMutex
_xmlFreeRefTable
_xmlFreeStreamCtxt
_xmlFreeTextReader
_xmlFreeTextWriter
_xmlFreeURI
_xmlFreeValidCtxt
Я не нашел способа исправить ошибку компоновки, но простойи безопасный способ обойти проблему - это признать тот факт, что xmlFree - это простая переменная-указатель функции, инициализированная по адресу стандартной функции free () в globals.c, и единственный способ изменить это назначение - перекомпилировать dll с некоторымипереключатели отладки.
Не стесняйтесь заменять вызовы xmlFree () на вызовы free ().Все должно быть хорошо, и ошибка связи исчезнет.