我正在尝试在Win7下使用mingw使用libxml2(v2.2.6.0)。 我已经添加了lib-llibmlx2,但是每次编译时都会出现以下错误:
error: undefined reference to `_imp__xmlFree'
我在谷歌上找到了这个链接:http://osdir.com/ml/gnome.lib.xml.ge.../msg00003.html,但仍然无法解决问题。
有什么想法吗?
谢谢...
我正在尝试在Win7下使用mingw使用libxml2(v2.2.6.0)。 我已经添加了lib-llibmlx2,但是每次编译时都会出现以下错误:
error: undefined reference to `_imp__xmlFree'
有什么想法吗?
谢谢...
我相信这个问题只会在使用Igor Zlatovic准备的预编译libxml2二进制文件时发生。我怀疑如果使用与mingw本地编译的libxml2库,则该问题会消失。
这是在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/xmlexport.h
首先观察,xmlFree不是函数而是变量。这是一个例外情况,因为几乎所有其他libxml2函数都是真正的导出函数。这解释了为什么xmlFree()是人们遇到的唯一有问题的函数。
mingw编译器将导入符号名称从xmlFree更改为_imp__xmlFree,而在libxml2.lib中找不到它。我猜在其他编译器(如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()的调用。一切都应该没问题,连接错误也会消失。
-DIN_LIBXML
添加到您的编译标志中(来自相关问题)。make distclean
。 - a.tabatabaeiexport CPPFLAGS=-DLIBXML_STATIC
也可以起作用:http://bug-gettext.gnu.narkive.com/ELwbaVMP/bug-48405-can-t-compile-gettext-0-19-8-1-for-windows - rogerdpack你可能早就解决了这个问题,但以防万一,请尝试使用-lxml2。也就是说,从库名称中删除lib前缀。您还可能需要使用-L选项设置搜索路径。在命令行上在-l之前指定-L。