mingw/libxml2问题

4

我正在尝试在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,但仍然无法解决问题。

有什么想法吗?

谢谢...

5个回答

4
这个问题可以通过在配置时使用"--disable-shared"标志来解决,例如:
./configure --prefix=/mingw --disable-shared

1
我尝试过,但没有成功。 - a.tabatabaei

2

我相信这个问题只会在使用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()的调用。一切都应该没问题,连接错误也会消失。


2
对我来说,lano1106提出的解决方案很有效。我使用MinGW重新编译了libxml2-2.9.9(按照这些步骤:https://blog.inventic.eu/2010/11/how-to-compile-open-source-libraries-under-windows-using-mingw/)。我在编译时遇到了nanohttp.c编译错误,该文件仅存在于MinGW 32位版本中(据说在MinGW64位版本中不存在),但我通过编辑该文件并按照此线程所示进行处理修复了该错误:https://gitlab.gnome.org/GNOME/libxml2/commit/d3de75782504c9136e504c6356bbae52fedf17e5。然后在Windows 10的Eclipse IDE中:
在项目->属性->C/C++ General ->路径和符号 ->包含标签页 ->GNU C++ ->添加 my_path\libxml2\include 在项目->属性->C/C++ Build ->设置 ->工具设置标签页 ->MinGW C++链接器 ->库
在库 (-l) 中添加 xml2,在库搜索路径 (-L) 中添加 C:\libxml2.libs
然后保存并重新编译。感谢这个解决方案,希望我的答案能对某些人有用或澄清问题!

2
尝试将-DIN_LIBXML添加到您的编译标志中(来自相关问题)。

这对我有用。但是在配置我的项目之前,我必须执行 make distclean - a.tabatabaei
那个可行。如果像我一样尝试在Windows上交叉编译gettext-0.19.8.1(可能还有以后的版本),则 export CPPFLAGS=-DLIBXML_STATIC 也可以起作用:http://bug-gettext.gnu.narkive.com/ELwbaVMP/bug-48405-can-t-compile-gettext-0-19-8-1-for-windows - rogerdpack

1

你可能早就解决了这个问题,但以防万一,请尝试使用-lxml2。也就是说,从库名称中删除lib前缀。您还可能需要使用-L选项设置搜索路径。在命令行上在-l之前指定-L。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接