备注:编译环境Microsoft Visual C++ .NET 7.1,编译版本为官方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中。
2. 解压crypto51.zip到/eMule0.49c-Sources/crypto51
该工程默认为VC6打开,复制cryptlib.dsp为cryptlib_vc71.dsp。使用VS2003打开,讲提示是否升级,同意后点击保存工程会生成:cryptlib_vc71.vcproj
3. 解压ResizableLib_1_3.zip到/eMule0.49c-Sources/ResizableLib
该工程默认为VC6打开,使用上述方法生成:ResizableLib_vc71.vcproj
4. 解压libpng-1.2.40.tar.gz到/eMule0.49c-Sources/libpng
默认即有:/libpng/projects/visualc71/libpng.vcproj
5. 解压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();}
3. 编译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
4. 编译eMule提示无法找到wmsdk.h
// Uncomment the following line if you get compile errors due to missing 'wmsdk.h'
#undef HAVE_WMSDK_H
5. 编译eMule提示没有找到wmvcore.lib
从网上下载一个,这个库是标准DirectShow的组件
6. 编译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
7. 编译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
8. 修改链接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)编译。
如此可以避免很多链接冲突问题。