mingw / libxml2问题

时间:2011-02-13 15:05:01

标签: 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
但仍然无效。

有什么想法吗?

感谢...

5 个答案:

答案 0 :(得分:4)

这可以通过使用“--disable-shared”标志进行配置来修复,例如:

./ configure --prefix = / mingw --disable-shared

答案 1 :(得分:2)

尝试将-DIN_LIBXML添加到编译标记中(来自related issue)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我相信只有在使用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不是函数,而是变量。这是一种特殊情况,因为几乎所有其他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中标准free()函数的地址.c和更改该分配的唯一方法是使用一些调试开关重新编译dll。

通过调用free()随意替换对xmlFree()的调用。一切都应该没问题,连锁错误就会消失。

答案 4 :(得分:1)

对我来说,lano1106 提出的解决方案运行良好。 我用 MinGW 重新编译了 libxml2-2.9.9(按照以下步骤:

https://blog.inventic.eu/2010/11/how-to-compile-open-source-libraries-under-windows-using-mingw/)

我遇到了仅在 MinGW 32 中存在 nanohttp.c 的编译错误(他们说在 MinGW64 中不存在),但我修复了它,如该线程所示编辑文件:

https://gitlab.gnome.org/GNOME/libxml2/commit/d3de75782504c9136e504c6356bbae52fedf17e5

然后在 Eclipse IDE 中,在 Windows 10 中:

在项目中 -> 属性 -> C/C++ 常规 -> 路径和符号 -> 包含选项卡 -> GNU C++ -> 添加 my_path\libxml2\include

在项目中 -> 属性 -> C/C++ 构建 -> 设置 -> 工具设置选项卡 -> MinGW C++ 链接器 -> 库

在库中 (-l) -> 添加了 xml2 在库搜索路径 (-L) -> 添加 C:\libxml2.libs

然后保存并重新编译。

感谢您的解决方案,我希望我的回答对某人有用或澄清!