Posted by & filed under Uncategorized.

About yangwei

wei yang has written 16 post in this blog.

备注:由于需要学习eMule,编译时有很多问题,所以查找了一些资料,下面的文章提供的方法可用。编译环境Visual studio 2010,编译版本为官方eMule v0.49版本,非国内VeryCD版本。

一:下载源代码和支持库
1.下载eMule v0.49 源代码

http://prdownloads.sourceforge.net/emule/eMule0.49c-Sources.zip
2.Crypto v5.1
http://www.cryptopp.com/crypto51.zip
3.zlib v1.2.3

http://www.zlib.net/zlib-1.2.3.tar.gz
4.ResizableLib 1.3 — A set of MFC classes to easily make resizable windows

http://sourceforge.net/projects/resizablelib/files/ResizableLib/1.3/ResizableLib_1_3.zip/download

5.libpng-1.2.40

http://prdownloads.sourceforge.net/libpng/libpng-1.2.40.tar.gz?download

 

二:编译前整理工作

  1. 解压eMule0.49c-Sources.zip到目录:eMule0.49c-Sources

可以看到eMule主工程目录在srchybrid文件夹, 另外该文件夹下已经携带了三个第三方库:EditBinX, id3lib, ReplaceVistaIcon和一个空壳库:zlib(只有工程文件,没有源文件)

使用VS.NET 2003直接打开srchybrid目录下的:emule_vc71-all.sln 会提示无法加载另外三个工程:

/crypto51/cryptlib_vc71.vcproj

/ResizableLib/ResizableLib_vc71.vcproj

/libpng/Projects/VisualC71/libpng.vcproj

因此需要把这些第三方工程导入到整个solution中。

  1. 解压crypto51.zip到/eMule0.49c-Sources/crypto51

该工程默认为VC6打开,复制cryptlib.dsp为cryptlib_vc71.dsp。使用VS2003打开,讲提示是否升级,同意后点击保存工程会生成:cryptlib_vc71.vcproj

  1. 解压ResizableLib_1_3.zip到/eMule0.49c-Sources/ResizableLib

该工程默认为VC6打开,使用上述方法生成:ResizableLib_vc71.vcproj

  1. 解压libpng-1.2.40.tar.gz到/eMule0.49c-Sources/libpng

默认即有:/libpng/projects/visualc71/libpng.vcproj

  1. 解压zlib-1.2.3.tar.gz中的文件到已存在的目录:/eMule0.49c-Sources/zlib

 

三:开始编译工作

  1. 此时VS2003打开emule_vc71-all.sln将看到比较完整的工程文件夹。根据依赖关系逐个编译。先编译依赖库,再编译eMule。
  2. 编译crypto

1.Crypto v5.1。对于VC .NET 2003编译器,我们要对源代码做以下修改:

在文件integer.cpp中把
AllocatorBase<T>::pointer AlignedAllocator<T>::allocate(size_type n, const void *)
改为
CPP_TYPENAME AllocatorBase<T>::pointer AlignedAllocator<T>::allocate(size_type n, const void *)

 

在文件pubkey.h中把
template <class PK, class GP>
class DL_KeyImpl : public PK
{
public:
typedef GP GroupParameters;

OID GetAlgorithmID() const {return GetGroupParameters().GetAlgorithmID();}
改为
template <class PK, class GP, class O = OID>
class DL_KeyImpl : public PK
{
public:
typedef GP GroupParameters;

O GetAlgorithmID() const {return GetGroupParameters().GetAlgorithmID();}

  1. 编译eMule提示无法找到sapi.h,解决线索如下

// NOTE: If you get a compile error due to missing ‘sapi.h’, look at “emule_site_config.h” for further information.

 

// ‘sapi.h’ is not shipped with VS2003.

// Uncomment the following line if you get compile errors due to missing ‘sapi.h’

#undef HAVE_SAPI_H

 

  1. 编译eMule提示无法找到wmsdk.h

// Uncomment the following line if you get compile errors due to missing ‘wmsdk.h’

#undef HAVE_WMSDK_H

  1. 编译eMule提示没有找到wmvcore.lib

从网上下载一个,这个库是标准DirectShow的组件

  1. 编译eMule提示无法找到:../crypto51/release/cryptlib.lib

需要修改工程设置中的Linker->Input->Additional Dependencies

../crypto51/release/cryptlib.lib 修改为:

../crypto51/release/cryptlib_vc71.lib

../crypto51/debug/cryptlib.lib 修改为:

../crypto51/debug/cryptlib_vc71.lib

  1. 编译eMule提示没有找到ResizableLib.lib.

Solution中ResizableLib Project比较奇怪,编译环境需要选择

Lib Release/Debug 而不是:

Unicode Release/Debug

C运行时库选择Multi-threaded(/MT)

../ResizableLib/ReleaseUnicode/ResizableLib.lib 修改为:

../ResizableLib/Release/ResizableLib_vc71.lib

../ResizableLib/DebugUnicode/ResizableLib.lib 修改为:

../ResizableLib/Debug/ResizableLib_vc71.lib

  1. 修改链接C的运行时库

EditBinX: Single-threaded(/ML) à Multi-threaded(/MT)

Ligpng: Multi-threaded DLL(/MD) à Multi-threaded(/MT)

ReplaceVistaIcon: Single-threaded(/ML) à Multi-threaded(/MT)

如果编译Release版,则所有eMule的支持库都用/MT编译。

如果编译Debug版,则所有eMule的支持库都用Multi-threaded debug(/MTd)编译。

如此可以避免很多链接冲突问题。

Leave a Reply

  • (will not be published)