编译电驴v1.1.15 with vs2010
?
//使用的系統(tǒng)是win7 32位英文版,VS2010-sp1英文版。電驢的代碼大概是10年10月份下載的。
本作者使用的 ?win 32位中文字版 vs2010 ? ? ? ? ? ? ? 電驢代碼是 ?2011.5.28 日在電驢官網(wǎng)下載
首先編譯所要用的庫。
1.?error C2440: 'initializing' : cannot convert from 'int' to 'const unsigned char *'。
錯(cuò)誤在文件utility(163)中,這個(gè)是編譯環(huán)境提供的文件。這種錯(cuò)誤一般是由模板實(shí)例化所引起的參數(shù)不匹配造成,因該在后面的錯(cuò)誤中改正。
錯(cuò)誤定位在下面這條語句:
return HashIdentifier(NULL, 0);
引起錯(cuò)誤的原因是在map中引入了c++ 0x的新特性,右值引用,而導(dǎo)致的參數(shù)演繹后類型不匹配。
修改:
return HashIdentifier((byte*)NULL,(unsigned int) 0);?
為啥要這樣強(qiáng)制轉(zhuǎn)換是因?yàn)橄旅?/p>
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> &'
這個(gè)是由于secblock.h缺少一個(gè)類型轉(zhuǎn)換構(gòu)造函數(shù)引起的。查閱了cryptlib的最新版本,發(fā)現(xiàn)增加了很多東西。其中有下面語句:
?? ?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
上面進(jìn)行了CryptoPP::AllocatorWithCleanup<CryptoPP::HuffmanDecoder::CodeInfo,0>?
到
CryptoPP::AllocatorWithCleanup<std::_Container_proxy,0>
的類型轉(zhuǎn)換。
修改:
在secbolck.h的103行(template <class U> struct rebind { typedef AllocatorWithCleanup<U> other; };)下面增加如下內(nèi)容:
#if _MSC_VER >= 1500
AllocatorWithCleanup() {}
template <class U, bool A> AllocatorWithCleanup(const AllocatorWithCleanup<U, A> &) {}
#endif
編譯。。。
暈,還是不行,看看這次的錯(cuò)誤,意思是說給AllocatorWithCleanup模板的參數(shù)太多了,比較了一下,確實(shí),新版的cryptlib庫中,這個(gè)模板有兩個(gè)參數(shù),舊版的就一個(gè)。于是將上面的A參數(shù)去掉:變?yōu)?/p>
?
#if _MSC_VER >= 1500//加在AllocatorWithCleanup 類定義里面 AllocatorWithCleanup() {} template <class U> AllocatorWithCleanup(const AllocatorWithCleanup<U> &) {} //template <class U, bool A> AllocatorWithCleanup(const AllocatorWithCleanup<U, A> &) {} #endif?
?
?
ok。
3.?接下來的錯(cuò)誤來自兩個(gè)資源庫。其實(shí)這個(gè)錯(cuò)誤很簡單,就是特別難找。錯(cuò)誤的提示大概如下:
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.
經(jīng)過堅(jiān)持不懈的搜索搜索在搜索,還是沒找到,最后無意中在工程屬性頁中發(fā)現(xiàn)了這個(gè):(如下圖)
看到了沒,那個(gè)if not啥啥啥的。這個(gè)動(dòng)作實(shí)在build之后的事件,而出錯(cuò)的原因就是,鏈接器成功創(chuàng)建了文件,但是現(xiàn)在卻找不到了。這個(gè)問題我在另一篇日志里講過,解決方法是將下圖中紅框中的內(nèi)容改成zh_TW(如果是大陸語言,則是zh_CH,注意不能在這加后綴dll,不然還是同樣的錯(cuò)誤):
到現(xiàn)在,lib庫編譯都沒有問題了,不過有個(gè)小問題,我始終沒找到解決方法。這個(gè)問題是這樣,就算我不改動(dòng)代碼,每次build(注意,不是rebuild)的時(shí)候,都有下列輸出:
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個(gè)庫是沒有問題的,但是上面兩個(gè)始終重新編譯,這樣會(huì)造成編譯時(shí)間延長。。。很不爽啊。
下面就該編譯電驢的代碼了。這塊我碰到2個(gè)錯(cuò)誤,一個(gè)是編譯時(shí),一個(gè)在鏈接時(shí)。
1.?第一個(gè)錯(cuò)誤是說:
1>WorkLayer/UPnP/UPnpMgr.cpp(500): error C2662: 'CUPnpNatMappingKey::Serialize' : cannot convert 'this' pointer from 'const CUPnpNatMappingKey' to 'CUPnpNatMappingKey &'
1> ? ? ? ? ?Conversion loses qualifiers
引發(fā)這條錯(cuò)誤的代碼是: it -> Serialize(ar); 這個(gè)錯(cuò)誤說的意思是,沒法將常量轉(zhuǎn)換成變量。原因在于set這個(gè)容器,set的begin函數(shù)在不同的標(biāo)準(zhǔn)庫中返回值的類型有一點(diǎn)小區(qū)別。有的實(shí)現(xiàn)返回const迭代器,而有的返回可修改迭代器。不幸的是,VS2010的stl中,set的begin總是返回的常量迭代器。 根據(jù)函數(shù)語義,修改如下:for (it = m_setAddedMapping.begin(); it != m_setAddedMapping.end(); it++) { CUPnpNatMappingKey key(*it); key.Serialize(ar); } ar.Close(); ? ? 也就是增加了一個(gè)臨時(shí)變量,讓這個(gè)可修改的變量來調(diào)用Serialize。 2. 第二個(gè)問題的錯(cuò)誤如下: uafxcwd.lib(afxglobals.obj) error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) already defined in ProgressCtrlX.obj 上面是意思是,連接器說,我找到了兩個(gè)定義,一個(gè)在 uafxcwd.lib(afxglobals.obj)里面,還有一個(gè)在ProgressCtrlX.obj 。 找了一下,電驢里包含一個(gè)MemDC.h文件,里面定義了一個(gè)CMemDC類,不巧的是,VS2010的MFC新增了這個(gè)類,所以鏈接時(shí)會(huì)出問題。 那怎么解決了?有如下辦法: 1 修改MFC中CMemDC的名字。這個(gè)明顯不行。。。 2 將emule中的CMemDC改個(gè)名字,這個(gè)方法可以,可是我找了下,貌似用這個(gè)類的文件還不少。不甘心一條條改,于是想出下面的方法。。。 3 增加一個(gè)宏定義, #define CMemDC XCMemDC 將上面的語句加到stdafx.h的最后。(也可以在工程屬性頁中以編譯器指令的形式定義宏,格式為 /D "CMemDC=XCMemDC")。 經(jīng)過5天斷斷續(xù)續(xù)的找啊改啊,驢子終于跑起來了,至于干不干活就在說吧,哈哈,睡覺! ps://本人發(fā)現(xiàn)的編譯問題
參考:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=306398
下載地址:http://www.codeplex.com/AtlServer?(http://www.codeplex.com/AtlServer)
把下載的東西解壓縮到一個(gè)目錄,比如c:/alt/
在VS里面[工具]--[選項(xiàng)]--[項(xiàng)目和解決方案]--[VC++目錄],在右上角選擇[包含引用的文件]中加入c:/alt/include就OK了
總結(jié)
以上是生活随笔為你收集整理的编译电驴v1.1.15 with vs2010的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: probe request帧结构_WIF
- 下一篇: 搜索词联想功能实现方案