在vs2008中编译(调试)eMule0.50a以及veryCD版的easyMule

13 篇文章 0 订阅

--------------------------------------------------------

关键字:

  • Vs2008 
  • eMule0.50a
  •  easyMule 
  • 调试 
  • atlrx.h 
  • windows SDK 7.0 
  • 增量链接
  • ITaskbarList3 
  • LNK2005
  • 无法解析的外部符号
  • LIBCMT and LIBCMTD
  • MTD
  • /FORCE:MULTIPLE
----------------------------------------------------------

Background:
目的是看看kAD的具体运算,因此下了eMule的最新版0.5a, 源代码的结构如果之前不了解,还是不太容易弄懂,因为开源软件一般都会有较多的依赖库。如果你在linux下debug过开源软件,你就知道库依赖的重要性了。以前在windows下太顺利,所以遇到一点挫折,如果google不出来就急的不行。eMule的源代码要想编译,是必须依赖几个lib的,他们一般也都是通过项目编译而来,试图从网上直接找lib和头文件的,反而太累人,因为你不知道后面需要多少个头文件,nnd,太多了。
【看看这个帖子:http://blog.csdn.net/colinchan/article/details/4648844 会增加一些了解,但是版本不同,需要解决的问题可能也就不同了】

按照网上大多数文章的说法, 具体如crypto,libpng,resizablelib,zlib等都需要google,然后到官方下,不过这些一般都没有vc9(vc2008)的项目版本,直接用08打开转换即可,很少出问题。但是: 事情总是没有那么顺利,不是找不全依赖lib的源项目,就是找到了编译出一堆错。本着前人种树,后人乘凉的想法,我直接g最好的解决方案,试了试,并没有发现完全适合我的环境的(win7+vs08+emula0.50a). 不过还是要感谢CSDN,资源里给了一个:【电驴最新版源码VS2008直接编译】【这个也是我最后编译eMule的重要帮手】


  • 直接编译(包含了lib解决方案)

但是这里的电驴不是国外eMule-project的那个,而是国内改造的easyMule。发布者给了很给力的说明,按其走着就可以了。
      ---------------
      编译说明(推荐使用Visual Studio .NET 2008)
     1.将rcdll.dll复制到Visual Studio .NET 2008安装目录的Vc\bin目录中。(这是为了使用能在vista下显示的图标)
     2.打开easyMule_vs2008_Libs.sln,执行“生成解决方案”。(easyMule_vs2008_Libs.sln里所包含的是easyMule所依赖的库文件。)
     3.打开easyMule_vs2008.sln编译即可。
      ---------------

  • Atlrx问题:

上面编译easyMule时出现了atlrx.h找不到的问题,如果你g下,会发现这个问题很普遍,是其中正则表达式用到的一个库,下面的这篇帖子告诉你怎么解决,无非是下载库,然后链接而已。

  • 增量链接问题
运行时,vs2008又出现了增量链接出错的问题,到属性->链接器->增量链接中关闭其,ok了
  • ITaskbarList3问题
这些问题也都是普遍问题,g下就会有解决方案,其实这里是windows7任务栏问题,需要安装对应的windows SDK, 看下面帖子吧:
http://blog.csdn.net/x313695373/article/details/6068603。 还有一个无法打开数据库文件的问题,这个帖子也有回答。不瞒您说,这些能遇到的问题我几乎都遇到了,不过还有万能的search engine,要不咱怎么办呢。。。

---------------------------------------------------------------------------------------------------------------------------------------

解决了以上问题,如果正常的话,easyMule是可以编译运行的,至少我成功了。

----------------------

但是我知道easyMule的改造还是蛮大的,虽然提高了eDonkey的一些默认服务连接点,增加了很多资源选择界面。但是实在是不喜欢那么大红大紫的界面,还有那来来往往的广告。决定还是要编译好原始的eMule0.50a。

刚才编译easyMule之所以简单,是因为它的配套库都有了,但是它虽然基于eMule,但是还是有较大变换,甚至源代码的组织都几乎完全不同。
然后事情总没有那么坏,至少现在我可以告诉你,他们的依赖库几乎是可以通用的(我说几乎,表明还是有例外,如后面我要说的CxImage等)

--------

于是我做了一下事情:
  1. 直接把easyMule项目里面的生成lib的解决方案:crypto51,crypto55, resizableLib,zlib, CxImage等全部改拷到了eMule源代码下(按照结构,它们是和srchybrid并列的,当然CxImage是默认放在srchybrid下的。
  2. 根据这些项目的位置以及产生的lib位置,调整eMule项目文件属性中链接器->输入->附加依赖项中的具体内容(它默认是有内容的,你要根据当前情况来调整)[注意,两个点开头表示上两级目录,一个点表示上一级目录]
    version.lib
    winmm.lib
    ws2_32.lib
    gdiplus.lib
    ADSIId.lib
    crypt32.lib
    wmvcore.lib
    ..\zlib\debug\zlib.lib
    ..\crypto51\crypto\debug\cryptlib.lib
    ..\id3lib\libprj\id3libD.lib
    .\CxImage\debug\cximage.lib
    ..\libpng\projects\visualc71\Win32_LIB_Debug\libpngd.lib
    ..\ResizableLib\DebugUnicode\ResizableLib.lib
    .\miniupnpc\debug_vc9\miniupnpc.lib
  3. 然后仔细确认各个依赖库生成顺利,边编译eMule,毫无疑问,错误是一大堆的。主要有:
-----------------------

  • 直接移过来的CxImage项目的输出函数MakeBitmap是单参数的,但在eMule0.50a中有一处是两个参数调用。这说明了eMule0.50a对应的那个CxImage版本的MakeBitmap函数(xImage.h定义,ximawnd.cpp中实现)是两个参数的。但这里为了简单,我就把eMule0.50a中的代码中两个参数的第二个给去掉了,这个参数是反应透明与否的,是关于界面,并不影响我对eMule网路的了解,所以果断cancel之。如果反之,即修改CxImage项目为两个参数,会出现【无法解析的外部符号】这样的错误,事实上,这个问题恼了我一个小时,我最终也没有解决之,所以我才不得已采用了上面的方法。

  •  error LNK2005: __initp_misc_invarg   已经在 libcmtd.lib(invarg.obj)   中定义。这是因为项目链接了两个库LIBCMT and LIBCMTD,以至于出现already defined。解决办法是: 
    1.确保当前工程的Runtime Library和引用lib的Runtime Library相同便可以解决问题 
    比如:lib库的Runtime Library是MD,当前工程也得设置为MD。 (我这里全是MTD)
    2.In Debug mode,在Debug命令行中加上/FORCE:MULTIPLE。(我在属性->配置->链接的命令行和调试的命令中都添加了,应该只需要一处吧,我懒得比较了).方法来自: http://weihe6666.iteye.com/blog/1405657

  • 至此,基本上ok了。编译,成功1个,警告n个,哎,总算可以歇会了。
-------------------------

还出现的其他问题是,我试图用release模式时,系统编译时提示我zlib.lib库文件找不到(因为链接到了一个没有的路径)。

我这里其实是投机取巧,把用在easyMule上的库直接用到eMule0.5上,的确简短了我去网上找对应windows版本,然后编译的过程。
其可实现原因和注意点有:
  • 主要是这些库都很成熟,多数已经出现很久,切已很少更新,所有这里easyMule和eMule用到的可以一致。
  • 还有就是easyMule和eMule这里我都用vs08编译,直接挪过来,不冲突。
  • 需要注意的libpng在easyMule中不是这样的,它是pnglib,我也懒得转换,这个是从官网下的,解压后为lpng1513文件夹,从里面深入多层后,可以找到vs7项目,转换,生成即可。
  • 另外easyMule用的是crypto55,但应该eMule还是用crypto51.
  • 还有CxImage项目编译是需要png文件夹的,由于都是从easyMule项目中copy过来,所以不妨把png folder给copy过来到CxImage同级目录,方便编译。
  • 安装windows SDK时,有点慢,不要急。还有只需要安装开发工具和头文件即可。
  • 我的系统是windows7。
  • 很多地方是debug_v9,在填写是注意,其实都无所谓,但是要一致。

--------------------

以上只是我回头看记起来的,其实我在编译过程中,痛苦的读了大量的国外论坛帖子和国内论坛帖子,对我的理解还是很有帮助的。
部分帖子如下:
http://forum.emule-project.net/index.php?showtopic=149213
http://www.cnblogs.com/jianu/archive/2010/12/25/how_to_compile_eMule_in_vs2008.html
http://blog.csdn.net/cecilulysess/article/details/4631458
http://jiangliwei.blogbus.com/logs/28509863.html

希望对你有所帮助。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
网上下载了emule0.50a-Xtreme8.1-sources源码,声称可以在VS2008下直接编译成功,经我实际测试,系统会报错,其第一类错误,由于系统为了兼容VISTA/WIN7,增加了相关定义,而这些定义在XP/WIN2003环境下会报错,共771个错误,如: 错误 2 error C2065: “ITaskbarList3”: 未声明的标识符 d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 195 emule 错误 3 error C2146: 语法错误 : 缺少“;”(在标识符“m_thbButtons”的前面) d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 196 emule 错误 4 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 196 emule 错误 5 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 196 emule 错误 6 error C2146: 语法错误 : 缺少“;”(在标识符“m_currentTBP_state”的前面) d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 198 emule 错误 7 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 198 emule 错误 8 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 198 emule 错误 10 error C2065: “ITaskbarList3”: 未声明的标识符 d:\emule相关资料\emule0.50a-xtreme\emule0.50a-xtreme8.1-sources\srchybrid\emuleDlg.h 195 emule ...... 此类错误,ITaskbarList3是VISTA/WIN7环境下与任务栏相关的变量,只要屏闭掉相关定义就能正常。 除此之外还报有下面 5 个错误(实际引起错误的位置只有两个): 错误 135 error C2059: 语法错误 : “:” d:\eMule\srchybrid\BaseClient.cpp 1603 emule 错误 136 error C2065: “tagName”: 未声明的标识符 d:\eMule\srchybrid\BaseClient.cpp 1604 emule 错误 137 error C2228: “.WriteTagToFile”的左边必须有类/结构/联合 d:\eMule\srchybrid\BaseClient.cpp 1604 emule 错误 139 error C2001: 常量有换行符 d:\eMule\srchybrid\BaseClient.cpp 4832 emule 错误 140 fatal error C1057: 宏展开遇到意外的文件结束 d:\eMule\srchybrid\BaseClient.cpp 4832 emule 此类错误,实际上是是两个语法错误,由于太过简单,我与网友都怀疑是作者故意制造的错误,若是完全不懂C++的人,即使拿到源码,编也会报错,从而止步于此。而稍懂C++的人(本人即是此类菜鸟),则可以找出错误之处。 为方便诸多象我一样的初学者,我把修正之后,可以在 XP/WIN2003 +VS2003SP1 环境下直接编译成功的emule0.50a-Xtreme8.1-sources源码发布上来,以便互相学习交流。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值