我正在尝试在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
但仍然无效。
有什么想法吗?
感谢...
答案 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
然后保存并重新编译。
感谢您的解决方案,我希望我的回答对某人有用或澄清!