使用的系统是win7 32位英文版,VS2010-sp1英文版。电驴的代码大概是10年10月份下载的。

首先编译所要用的库。

1. error C2440: 'initializing' : cannot convert from 'int' to 'const unsigned char *'。

错误在文件utility(163)中,这个是编译环境提供的文件。这种错误一般是由模板实例化所引起的参数不匹配造成,因该在后面的错误中改正。

错误定位在下面这条语句:

return HashIdentifier(NULL, 0);

引起错误的原因是在map中引入了c++ 0x的新特性,右值引用,而导致的参数演绎后类型不匹配。

修改:

return HashIdentifier((byte*)NULL,(unsigned int) 0);

为啥要这样强制转换是因为下面

typedef std::pair<const byte *, unsigned int> HashIdentifier;

(查了一下,最新版的cryplib库可以在Vs2010中编译通过,解决问题的方法和上面的一样)

2.  error C2664: 'CryptoPP::AllocatorWithCleanup<T>::AllocatorWithCleanup(const CryptoPP::AllocatorWithCleanup<T> &)' : cannot convert parameter 1 from 'CryptoPP::AllocatorWithCleanup<T>' to 'const CryptoPP::AllocatorWithCleanup<T> &'

这个是由于secblock.h缺少一个类型转换构造函数引起的。查阅了cryptlib的最新版本,发现增加了很多东西。其中有下面语句:

template <class U> struct rebind { typedef AllocatorWithCleanup<U, T_Align16> other; };

#if _MSC_VER >= 1500  //表示编译器版本大于或等于1500

AllocatorWithCleanup() {}

template <class U, bool A> AllocatorWithCleanup(const AllocatorWithCleanup<U, A> &) {}

#endif

上面进行了CryptoPP::AllocatorWithCleanup<CryptoPP::HuffmanDecoder::CodeInfo,0>

CryptoPP::AllocatorWithCleanup<std::_Container_proxy,0>

的类型转换。

修改:

在secbolck.h的103行(template <class U> struct rebind { typedef AllocatorWithCleanup<U> other; };)下面增加如下内容:

#if _MSC_VER >= 1500

AllocatorWithCleanup() {}

template <class U, bool A> AllocatorWithCleanup(const AllocatorWithCleanup<U, A> &) {}

#endif

编译。。。

晕,还是不行,看看这次的错误,意思是说给AllocatorWithCleanup模板的参数太多了,比较了一下,确实,新版的cryptlib库中,这个模板有两个参数,旧版的就一个。于是将上面的A参数去掉:变为

template <class U> AllocatorWithCleanup(const AllocatorWithCleanup<U> &) {}

ok。

3. 接下来的错误来自两个资源库。其实这个错误很简单,就是特别难找。错误的提示大概如下:

1>I:/Program Files/MSBuild/Microsoft.Cpp/v4.0/Microsoft.CppCommon.targets(113,5): error MSB3073: The command "if not exist ../debug/lang md ../debug/lang

1>I:/Program Files/MSBuild/Microsoft.Cpp/v4.0/Microsoft.CppCommon.targets(113,5): error MSB3073: copy "E:/My Documents/easyMule-VeryCD-src--win7/src/lang/dynamic/languages - Chinese (Taiwan).dll" ../debug/lang/languages - Chinese (Taiwan).dll

1>I:/Program Files/MSBuild/Microsoft.Cpp/v4.0/Microsoft.CppCommon.targets(113,5): error MSB3073:

1>I:/Program Files/MSBuild/Microsoft.Cpp/v4.0/Microsoft.CppCommon.targets(113,5): error MSB3073: :VCEnd" exited with code 1.

经过坚持不懈的搜索搜索在搜索,还是没找到,最后无意中在工程属性页中发现了这个:(如下图)

看到了没,那个if not啥啥啥的。这个动作实在build之后的事件,而出错的原因就是,链接器成功创建了文件,但是现在却找不到了。这个问题我在另一篇日志里讲过,解决方法是将下图中红框中的内容改成zh_TW(如果是大陆语言,则是zh_CH,注意不能在这加后缀dll,不然还是同样的错误):

到现在,lib库编译都没有问题了,不过有个小问题,我始终没找到解决方法。这个问题是这样,就算我不改动代码,每次build(注意,不是rebuild)的时候,都有下列输出:

1>------ Build started: Project: id3lib, Configuration: Debug Win32 ------

2>------ Build started: Project: cryptlib, Configuration: Debug Win32 ------

1>Build started 2011/4/6 21:24:05.

2>Build started 2011/4/6 21:24:05.

2>InitializeBuildStatus:

2>  Creating "./Debug/cryptlib.unsuccessfulbuild" because "AlwaysCreate" was specified.

1>InitializeBuildStatus:

1>  Creating "./Debug/id3lib.unsuccessfulbuild" because "AlwaysCreate" was specified.

1>ClCompile:

2>CustomBuild:

2>  Performing Custom Build Tools

1>  All outputs are up-to-date.

1>I:/Program Files/MSBuild/Microsoft.Cpp/v4.0/Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(E:/My Documents/easyMule-VeryCD-src--win7/id3lib/libprj/./Debug/id3lib.lib) does not match the Library's OutputFile property value (E:/My Documents/easyMule-VeryCD-src--win7/id3lib/libprj/id3libD.lib). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Lib.OutputFile).

1>I:/Program Files/MSBuild/Microsoft.Cpp/v4.0/Microsoft.CppBuild.targets(1153,5): warning MSB8012: TargetName(id3lib) does not match the Library's OutputFile property value (id3libD). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Lib.OutputFile).

1>Lib:

1>  All outputs are up-to-date.

1>  id3lib_2005.vcxproj -> E:/My Documents/easyMule-VeryCD-src--win7/id3lib/libprj/./Debug/id3lib.lib

2>ClCompile:

2>  All outputs are up-to-date.

1>BscMake:

1>  All outputs are up-to-date.

1>FinalizeBuildStatus:

1>  Deleting file "./Debug/id3lib.unsuccessfulbuild".

1>  Touching "./Debug/id3lib.lastbuildstate".

1>

1>Build succeeded.

1>

1>Time Elapsed 00:00:00.24

2>  All outputs are up-to-date.

2>  All outputs are up-to-date.

2>Lib:

2>  All outputs are up-to-date.

2>  cryptlib_2005.vcxproj -> E:/My Documents/easyMule-VeryCD-src--win7/crypto51/crypto/./Debug/cryptlib.lib

2>FinalizeBuildStatus:

2>  Deleting file "./Debug/cryptlib.unsuccessfulbuild".

2>  Touching "./Debug/cryptlib.lastbuildstate".

2>

2>Build succeeded.

2>

2>Time Elapsed 00:00:00.27

========== Build: 2 succeeded, 0 failed, 9 up-to-date, 0 skipped ==========

有9个库是没有问题的,但是上面两个始终重新编译,这样会造成编译时间延长。。。很不爽啊。

下面就该编译电驴的代码了。这块我碰到2个错误,一个是编译时,一个在链接时。

1. 第一个错误是说:

1>WorkLayer/UPnP/UPnpMgr.cpp(500): error C2662: 'CUPnpNatMappingKey::Serialize' : cannot convert 'this' pointer from 'const CUPnpNatMappingKey' to 'CUPnpNatMappingKey &'

1>          Conversion loses qualifiers

引发这条错误的代码是:
it -> Serialize(ar);
这个错误说的意思是,没法将常量转换成变量。原因在于set这个容器,set的begin函数在不同的标准库中返回值的类型有一点小区别。有的实现返回const迭代器,而有的返回可修改迭代器。不幸的是,VS2010的stl中,set的begin总是返回的常量迭代器。
根据函数语义,修改如下:
for (it = m_setAddedMapping.begin(); it != m_setAddedMapping.end(); it++) { CUPnpNatMappingKey key(*it); key.Serialize(ar); } ar.Close(); 
也就是增加了一个临时变量,让这个可修改的变量来调用Serialize。
2. 第二个问题的错误如下:
 uafxcwd.lib(afxglobals.obj)   error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) already defined in ProgressCtrlX.obj   
上面是意思是,连接器说,我找到了两个定义,一个在 uafxcwd.lib(afxglobals.obj)里面,还有一个在ProgressCtrlX.obj   。
找了一下,电驴里包含一个MemDC.h文件,里面定义了一个CMemDC类,不巧的是,VS2010的MFC新增了这个类,所以链接时会出问题。
那怎么解决了?有如下办法:
1 修改MFC中CMemDC的名字。这个明显不行。。。
2 将emule中的CMemDC改个名字,这个方法可以,可是我找了下,貌似用这个类的文件还不少。不甘心一条条改,于是想出下面的方法。。。
3 增加一个宏定义,
#define CMemDC XCMemDC
将上面的语句加到stdafx.h的最后。(也可以在工程属性页中以编译器指令的形式定义宏,格式为 /D "CMemDC=XCMemDC")。
经过5天断断续续的找啊改啊,驴子终于跑起来了,至于干不干活就在说吧,哈哈,睡觉!

easyMule-VeryCD-src---VS2010调试笔记相关推荐

  1. ARM+Movidius VPU 目标识别调试笔记(一)

    写在前面 Movidius 是一家被Intel收购的计算机视觉创业公司.Intel收购Movidius之后,在AI和边缘计算方面的布局又增加了一支生力军.Movidius的AI芯片分为Myriad x ...

  2. android 调试笔记

    android 调试笔记 adb使用: 连接不上手机 C:\Users\Administrator\.android\adb_usb.ini   增加一行内容:  0x1782 安装第三方应用 $ a ...

  3. zynq linux ip配置,ZYNQ+linux网口调试笔记(2)PS-GEM1

    1. 开发环境 Windows SDK 2017.4 Ubuntu Petalinux 2017.4 硬件平台:米联客ZYNQ开发板MIZ7035 2. 开发目标 在ZYNQ上使用gigE Visio ...

  4. RK3288[android 7.1]调试笔记 隐藏底部状态栏截屏按钮

    RK3288[android 7.1]调试笔记 隐藏底部状态栏截屏按钮 修改frameworks/base/packages/SystemUI/src/com/android/systemui/sta ...

  5. 调试笔记--jlink 变量转实时波形小技巧

    调试笔记–jlink 变量转实时波形小技巧 上篇讲了jlink RTT组件在RAM中开辟一段内存,将printf字符串存入然后通过jlink调试接口读取RAM,将printf字符串在jlink-RTT ...

  6. 调试笔记--keil 测量周期小技巧

    调试笔记–keil 测量周期小技巧 本文参考安富莱专题教程第7期 http://www.armbbs.cn/forum.php?mod=viewthread&tid=87176&ext ...

  7. 调试笔记--keil 断点调试小技巧

    调试笔记–keil 断点调试小技巧 给变量打断点 调试不熟悉的项目时,卧槽!怎么这么多全局变量?这玩意又在那修改了??这个时候会给变量打断点就能省好多事. 将要监视的全局变量添加到watch窗口 选中 ...

  8. gpio驱动广播Android,[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】

    Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 由于板子没有lcd无法得知sd卡升级是否完成,因此使用LED显示. Recovery中升级完成后控 ...

  9. QT调用dll且进入DLL src code调试

    qt应用程序AA.exe调用qt写的BB.DLL时,进入BB.DLL src code调试 1.debug生成AA.exe 2.将debug生成的AA.exe整包debug folder放到BB.dl ...

  10. VS2010调试快捷键

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

最新文章

  1. Python判断一个字符串是否包含某个指定的字符串
  2. 3周第4次课 df、du命令 fdisk磁盘分区
  3. HDU 3081 Marriage Match II【并查集+二分图最大匹配】
  4. 如何查看 .NET Core 3.1 源代码
  5. python编程单词排序_Python编程20:字典的遍历和排序
  6. Scipy 基础 —— 稀疏矩阵
  7. Python爬虫实践(三) -- 用户全量数据爬取、多媒体信息爬取
  8. 最新鼎捷易飞9.0.12ERP制造业ERP系统介绍
  9. Linux配置VNC远程桌面
  10. “猫”和路由器是一个东西吗?
  11. 漂泊在汉语视界中的蒙古歌者
  12. STM32 调整重启电压阈值 BOR
  13. 【第三章 有限自动机与右线性文法】形式语言与自动机第三章个人总结复习笔记分享!(含文件、持续更新...)
  14. L1-022 奇偶分家 (10 分) 含解题思路 C语言 位运算
  15. 扩展欧几里得算法、乘法逆元与中国剩余定理
  16. Next.js v4.1.4 文档中文翻译
  17. 2022大三计算机 | 保研机试 | 学习路线
  18. 后台利用aop注解的方式防止重复提交
  19. centos离线配置yun源
  20. linux deb文件安装

热门文章

  1. 根据银行卡号码获取银行卡归属行以及logo图标
  2. Web安全扫描器Netsparker v3.5发布
  3. 海康威视球机摄像头晚上补光灯闪烁问题
  4. 好看的2020年html倒计时源码
  5. 数学基础知识总结 —— 6. 基本矩阵运算公式
  6. SPSS统计分析专题系列(一、认识SPSS)
  7. java 配置文件参数_从Java的配置文件中读取配置参数的最佳方法是什么?
  8. 爬虫mm131明星照片
  9. 南方cass10.1中文安装教程
  10. C++ 已知两点坐标和半径求圆心坐标程序