作者:XCyber
日期:2004-10-10
e-mail:[email protected]
編譯環境:Microsoft Visual C++ .NET 2003 (v7.0)
eMule版本:0.44b
[1]下載源代碼和支持庫
1.下載eMule v0.44b 源代碼
http://www.emule-project.com/
2.Crypto++ v5.1
http://www.eskimo.com/~weidai/cryptlib.html
3.zlib v1.2.1
http://www.gzip.org/zlib/
4.id3lib v3.8.3
http://sourceforge.net/projects/id3lib/
5.libpng
http://www.libpng.org/pub/png/libpng.html
或
http://sourceforge.net/projects/libpng/
6.ResizableLib 1.3
http://sourceforge.net/projects/resizablelib/
[2]編譯eMule所需要的庫。
注意:編譯的所有庫工程的Run-Time Libaray都統一用用Multi-threaded (/MT)
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();}
然後編譯Release版本,把生成的cryptlib.lib和頭文件放到eMule下的crypto51。
2.ResizableLib 1.3
編譯成Release Static版本,把ResizableLib.lib和頭文件拷到eMule下的ResizableLib。
3.zlib v1.2.1
首先,打開zlib/Makefile.msc文件,把
CFLAGS = -nologo -MD -O2 $(LOC)
改爲
CFLAGS = -nologo -MT -O2 $(LOC)
統一使用/MT 運行時庫。
然後,在zlib/下運行nmake /a /f win32/Makefile.msc。(運行nmake前先運行VS.NET2003下vc7/bin/vcvars32.bat註冊編譯環境變量),把生成的zlib.lib和頭文件放到eMule下的zlib。
4.libpng
進入png/projects/visualc6打開libpng工程,在libpng工程裏添加之前生成的zlib頭文件和庫文件路徑,編譯成LIB ASM Release,然後把libpng.lib改名爲png.lib,包括頭文件一起拷到eMule下的png。
5.id3lib v3.8.3
解壓id3lib v3.8.3,把config.h.win32改爲config.h,然後進入解壓後目錄下的libprj並打開工程文件,去掉id3lib v3.8.3自帶zlib庫的頭文件路徑,添加之前編譯好zlib庫的頭文件路徑,編譯Release版本。把生成的id3lib.lib和頭文件拷到eMule下的id3。
6.CxImage 進入eMule/CxImage,打開工程文件,設置正確的png和zlib的庫文件和頭文件路徑,然後編譯Release版本,把生成的CxImage.lib拷到eMule/CxImage下。
[3]編譯eMule
打開DialogMinTrayBtn.cpp把下面的
#if 0
// define this to use that source file as template
#define TEMPLATE template <class BASE>
#else
// define this to instantiate functions for class 'BASE' right in this CPP module
#define TEMPLATE
#define BASE CResizableDialog
#endif
改爲
#if 0
// define this to use that source file as template
#define TEMPLATE template <class BASE>
#else
// define this to instantiate functions for class 'BASE' right in this CPP module
#define TEMPLATE template <>
#define BASE CResizableDialog
#endif
檢查一下所需要的頭文件目錄和庫文件是否正確,然後就可以編譯Release版本的eMule了。如果所有eMule的支持庫都用/MT編譯的話,應該鏈接不會出什麼問題,如果還是出現運行時庫符號衝突,可以在鏈接參數裏忽略某些運行時庫。
官方的eMule編譯通過了,接下來我們可以幹嘛呢?如果你是牛人,又覺得現在的eMule不合自己口味,那你大可以修改它,但是如果你想發佈你自己的eMule版本,別忘了把源代碼也一起發佈喔,因爲eMule是受到GNU保護的。有點廢話了,牛人又怎麼會看這篇文章啦~~~~哈哈~~eMule的代碼確實寫得很優秀,是一個難得的學習機會。