--------------------------------------------------------
关键字:
- 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编译即可。
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等)
--------
于是我做了一下事情:
- 直接把easyMule项目里面的生成lib的解决方案:crypto51,crypto55, resizableLib,zlib, CxImage等全部改拷到了eMule源代码下(按照结构,它们是和srchybrid并列的,当然CxImage是默认放在srchybrid下的。
- 根据这些项目的位置以及产生的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 - 然后仔细确认各个依赖库生成顺利,边编译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
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
希望对你有所帮助。