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

关键字:

  • 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的重要帮手】
http://download.csdn.net/download/WS355362/3378757
  • 直接编译(包含了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下,会发现这个问题很普遍,是其中正则表达式用到的一个库,下面的这篇帖子告诉你怎么解决,无非是下载库,然后链接而已。
 http://blog.csdn.net/wu_huiwen/article/details/5523128。
  • 增量链接问题
运行时,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
http://blog.csdn.net/wu_huiwen/article/details/5523128
希望对你有所帮助。

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

  1. Visual Studio 2005中编译调试新功能

    在日常的编程中,程序员经常离不开的工作之一,就是调试.当写好一段代码或程序后,在运行后总会出现这样那样的问题,比如各样的错误,程序员就必须进行调试,将这些错误排除.在最新出炉的Visual Studi ...

  2. 在vs2008中编译Secret Maryo Chronicles

    Secret Maryo Chronicles是一款类似于马里奥的开源游戏.是优秀2D模版卷轴游戏的典范.是学习2D游戏设计的好材料 这是个由C++写的游戏.使用了openGL+SDL作为主框架.以及 ...

  3. VS2008中编译和使用OpenSSL

    一.编译OpenSSL 在编译OpenSSL前,需要正确安装Perl,因为在编译OpenSSL时需要使用到该程序. 下载最新版本的Perl:http://downloads.activestate.c ...

  4. linux使用vscode运行c,Linux中使用VS Code编译调试C++项目详解

    前言 关于VS Code在Linux下的安装这里就不提了,不管是CentOS还是Ubuntu,如果不懂且搜问题足够的情况下,你会解决的. 一.前置知识--gcc/g++的编译链接过程 在Windows ...

  5. libgc 加 .mak 在 vc6 vs2008 中的编译方法

    libgc 加 .mak 在 vc6 vs2008 中的编译方法 libgc 加 .make 在 vc6 vs2008 中的编译方法 开源代码多数是用 .mak 编译 win 平台,网上的教程多是说明 ...

  6. Qt for ios 在 xcode 中编译(便于调试)

    前言 用 Qt 开发 IOS 程序需要搭配最新版的 xcode 才能进行编译,这个毫无疑问吧.如果需要设置程序图标或启动页之类这种平台性的功能,直接在 xcode 中进行设置是最方便的,并且在 xco ...

  7. VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件

    VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件 参考文章: (1)VS2008 在IE8中 调试 Acti ...

  8. VLD 在VS2019中编译通过,但调试时报 应用程序无法正常启动(0xc0150002)

    @[TOC](VLD 在VS2019中编译通过,但调试时报 应用程序无法正常启动(0xc0150002)) 背景 Visual LeakDetector(VLD)是一款用于Visual C++的免费的 ...

  9. xcode7中,无需证书即可进行真机编译调试!

    iOS开发总是面临一个问题,借不到机器进行测试,自己的机器又不能使用.每到这个时候我都在想,苹果什么时候给力一点? 现在,苹果终于给力了!Xcode7全新特性来袭,下面为大家介绍: 无需证书的真机编译 ...

  10. 程序编译中如何调试configure

    通常,在软件包的 README 文件中只能找到非常简单的"编译说明:运行 configure,然后运行 make".但是,这样行不通时怎么办?在本文中,Peter Seebash ...

最新文章

  1. linux基础命令介绍十四:定时任务
  2. Android 动画小知识点
  3. [YTU]_2906( 多重继承 日期与时间)
  4. HDFS集中式的缓存管理原理与代码剖析--转载
  5. 叶明哲 | 数据中心空调文章集锦
  6. 自然语言处理顶会 ACL 2018 参会见闻
  7. 牛客 contest893 H-Chat (dp)
  8. postgresql update使用别名_PostgreSQL逻辑复制之pglogical
  9. Alt Gr or Shift
  10. 为什么单击用户账户没有反应_win10用户获取最高权限的方法
  11. HT for Web中3D流动效果的实现与应用
  12. R语言分布的卡方拟合优度检验
  13. #1829 : Tomb Raider(哈希)
  14. php doctrine,PHP-如何使用Doctrine DBAL?
  15. python获取pdf页数_Python分割指定页数的pdf文件方法
  16. bilibili视频流量数据潜望镜
  17. Fabric 1.0源代码分析(22)Ledger #blkstorage(block文件存储)
  18. GTD软件比较和选用
  19. 工厂仪表定时拍照智能AI算法识别内网部署方案
  20. 使用docker和jenkins简单部署springboot项目

热门文章

  1. 矩阵的逆和矩阵的转置运算公式对比
  2. David Pozar 微波工程读书笔记(二)
  3. Opencv 形态学操作 灰度、滤波、膨胀腐蚀、开闭运算、梯度-python代码
  4. 代码雨大全(装逼或学习)--KuaiLe推荐
  5. 南方cass10.1中文安装教程
  6. COIN3D拖拽器使用
  7. Local Binary Patterns LBP算法
  8. CCS10.2安装步骤
  9. 嵌入式应用程序下载到ARM开发板后如何运行程序?
  10. 4.7UF400V 10*8.4贴片铝电解电容封装尺寸