分类: Windows平台
2015-08-11 11:36:19
|
Linking... Creating library ..\..\..\Release\subversion\libsvn_ra\libsvn_ra-1.lib and object ..\..\..\Release\subversion\libsvn_ra\libsvn_ra-1.exp libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_GetCurrentLineNumber referenced in function _ne_xml_currentline libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_ErrorString referenced in function _ne_xml_parse libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_GetErrorCode referenced in function _ne_xml_parse libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_Parse referenced in function _ne_xml_parse libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_ParserFree referenced in function _ne_xml_destroy libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_SetXmlDeclHandler referenced in function _ne_xml_create libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_SetUserData referenced in function _ne_xml_create libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_SetCharacterDataHandler referenced in function _ne_xml_create libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_SetElementHandler referenced in function _ne_xml_create libneon.lib(ne_xml.obj) : error LNK2019: unresolved external symbol __imp__XML_ParserCreate referenced in function _ne_xml_create ..\..\..\Release\subversion\libsvn_ra\libsvn_ra-1.dll : fatal error LNK1120: 10 unresolved externals 整个build过程过关闯将,解决了zlib和neon的错误后,最后被这个错误拦住了,非常地莫名其妙。 中间也经历过zlib的Link错误,zlib 1.2.5与目前的版本不兼容,无法使用,退回1.2.4。 现在终于明白了,原来,原来是这么回事。 Apache httpd编译后,apr-util的XML解析器expat只生成了一个静态链接的xml.lib版本,并且不在lib目录下,而是在 lib\libR目录下。 按照通常的思路,LNK2019符号找不到,但是我发现neon编译没有错误,链接正常,说明没有找到lib文件。根据函数名搜索, 比如XML_SetElementHandler,发现ne_xml.c引用。用__imp__XML_SetElementHandler或者imp__XML_SetElementHandler均 搜不到东西。 当时没有意识到,__imp__打头的函数是DLL文件中函数的stub而已。结果一直在linker找不到lib文件上找原因,浪费 了很多时间。刚才重新看了一遍LNK2019的错误原因,可以用dumpbin /SYMBOLS看lib或obj文件的Symbol。这下好了,根本 不存在__imp__打头的函数,这才猛然醒悟,原来如此。 原因找到后,解决方法有两种,一种是生成一个xml.dll和xml.lib,另一种是让neon静态链接xml.lib。但是为什么, 为什么编译neon本身是没有问题的?它是静态链接,问题在libsvn_ra引用的neon.lib文件不对,目录错误?版本错误? libneon.lib只有一个版本,说明它要求链接expat的dll版本,可是httpd编译时没有生成,这是问题所在。而且检查 xml.mak文件只有生成静态链接的版本,怎么回事呢?问题出在neon-0.27.2.tar.gz不兼容apr-util-1.3,不知道。 ========================================================================================================== 奶奶个蛋,expat.h中这么一段: #if !defined(XML_STATIC) && !defined(XMLIMPORT) #ifndef XML_BUILDING_EXPAT /* using Expat from an application */ #ifdef XML_USE_MSC_EXTENSIONS #define XMLIMPORT __declspec(dllimport) #endif 也就是说默认就是XMLIMPORT。 而在neon的neon.mak文件中: BUILD_EXPAT = 1 !IF "$(EXPAT_INC)" == "" !IFNDEF EXPAT_FLAGS EXPAT_FLAGS = BUILD_EXPAT = !ENDIF !ELSE EXPAT_FLAGS = /I "$(EXPAT_INC)" /D HAVE_EXPAT /D HAVE_EXPAT_H /D NE_HAVE_DAV !ENDIF 没有加 /D XML_STATIC,所以被动态链接了。问题应该在这里!!! 静态链接和动态链接的头文件应该不一样,因为函数名称发生了变化。 修改neon.mak文件,EXPAT_FLAGS加上XML_STATIC,如下: EXPAT_FLAGS = /I "$(EXPAT_INC)" /D HAVE_EXPAT /D HAVE_EXPAT_H /D NE_HAVE_DAV /D XML_STATIC 终于编译成功了,呵呵! |