mingw/libxml2 问题

标签 mingw libxml2

我正在尝试在 win7 下将 libxml2 (v2.2.6.0) 与 mingw 一起使用
我添加了 lib -llibmlx2,但每次编译时我都会得到:

error: undefined reference to `_imp__xmlFree'

在谷歌上我发现了这个:
http://osdir.com/ml/gnome.lib.xml.ge.../msg00003.html
但仍然不起作用。

任何想法 ?

谢谢...

最佳答案

我相信这个问题只会在使用 Igor Zlatovic 准备的预编译 libxml2 二进制文件时发生。我怀疑如果使用使用 mingw 本地编译的 libxml2 lib,问题就会消失。

这是 libxml/globals.h 中 xmlFree 的声明:

#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 不是函数而是变量。这是一个异常(exception)情况,因为几乎所有其他 libxml2 函数都是真正的导出函数。这就解释了为什么 xmlFree() 是人们遇到的唯一有问题的函数。

mingw 编译器将导入的符号名称从 xmlFree 更改为 libxml2.lib 中未找到的 _imp__xmlFree。我猜测对于其他编译器(例如 MSVC),链接器正在搜索在 libxml2.lib 中找到的正确符号 _xmlFree:
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 是一个简单的函数指针变量,它被初始化为 globals.c 中标准 free() 函数的地址和更改该分配的唯一方法是使用一些调试开关重新编译 dll。

随意将调用 xmlFree() 替换为调用 free()。一切都应该没问题,链接错误就会消失。

关于mingw/libxml2 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4984853/

相关文章:

c++ - 静态链接,在 Windows 下正确工作的 readline 库?

c++ - Gtkmm 编译错误

dll - 在 MinGW 中使用 libdl.so

xml - XSLT 1.0 (xsltproc) - 无法解析巨大的 XML

xml - 如何使用 Perl XML::LibXML 表示默认的空命名空间

c++ - 哪个 C++ XSLT 处理器?

c++ - 带有旧版本库的 MinGW

c++ - 如何有条件地为 Eclipse 中的交叉编译项目包含两个相同版本的不同名称的库?

xml - 如何使用 gokogiri (libxml2) 解析带有命名空间的 xml?

xpath - 如何在LibXml 2中使用Xpath