分类: 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
终于编译成功了,呵呵!
|