Chinaunix首页 | 论坛 | 博客
  • 博客访问: 642844
  • 博文数量: 133
  • 博客积分: 1566
  • 博客等级: 上尉
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-01 09:31
文章分类

全部博文(133)

文章存档

2019年(1)

2018年(1)

2017年(8)

2016年(9)

2015年(17)

2014年(4)

2013年(31)

2012年(25)

2011年(36)

2010年(1)

我的朋友

分类: 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
终于编译成功了,呵呵!
阅读(3915) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~