VS2010編譯Gh0st3.6_第1頁
VS2010編譯Gh0st3.6_第2頁
VS2010編譯Gh0st3.6_第3頁
VS2010編譯Gh0st3.6_第4頁
VS2010編譯Gh0st3.6_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、VS2010編譯Gh0st3.6 (一)Vs編譯Gh0st修改的工作量還是挺大的,畢竟從VC6.0移植到VS2010平臺,已經是一個很大的跨越了,VS2010相對于VC6.0也改進了不止一點了。Gh0st3.6使用了第三方界面庫CJ60Lib,目前這個庫只支持到VC6.0,而其后的版本已經商業(yè)化,所以使用VS2010編譯Gh0st的時候,需要重新編譯CJ60Lib。VS2010的自帶安裝的Windows SDK已經到了7.1版,也不需要像VC6.0那樣需要下載Windows SDK,并配置環(huán)境了。VC6.0支持的最高版本的Windows SDK 是Windows 2003的,而VS2010自帶

2、的7.1版已經到了Windows Server 2008 了,其中發(fā)生的變化也是很大的。下面具體來操作一次。先列一下幾個主要下文件路徑。用的是Gh0s3.6原版,硬盤鎖代碼已經注釋。E:ProgrammingVS2010Gh0st3.6 E:ProgrammingVS2010Gh0st3.6gh0st.dsw E:ProgrammingVS2010Gh0st3.6gh0stCJ60Lib E:ProgrammingVS2010Gh0st3.6gh0stCJ60LibCJ60LibCJ60Lib.dsw E:ProgrammingVS2010Gh0st3.6gh0stCJ60LibLib一編譯C

3、J60Lib庫直接用VS2010打開CJ60Lib.dsw進行轉換。一共有7個,有4個是已經不存在的項目了,直接刪掉。在灰色的項目上點右鍵Remove,或直接按Del鍵刪除。1.1編譯CJ60StaticLib直接在CJ60StaticLib項目上點右鍵 Project Only - Build Only CJ60StaticLib或者是 Rebuild Only CJ60StaticLib。以后說編譯某個項目也是這樣,不再重復說明了。1.1.1首先修改程序配置,讓默認的字符都為ANSI字符,VS2010默認為寬字符Unicode版。項目右鍵屬性C/C+LanguageWChar_tNo,如圖

4、所示:修改編譯后,對照錯誤,再來一個一個的修改。1.1.21> stdafx.cpp 1> _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h) 1>e:programmingvs2010gh0st3.6gh0stcj60libcj60libstdafx.h(51): fatal error C1083: 無法打開包括文件:“.srcafximpl.h”: No such file or directory雙擊這個錯誤,定位到 stdafx.h 中的#include <

5、.srcafximpl.h> 把這句話改成 #include <.srcmfcafximpl.h>1.1.3接著修改warning C4819警告warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為 Unicode 格式以防止數(shù)據(jù)丟失這個警告至需要雙擊打開該文件,然后保存就可以了。1.1.4gh0st3.6gh0stcj60libcj60libsubclass.cpp(117): error C2065: “p”: 未聲明的標識符這是因為VS更符號C+標準,臨時變量的作用域已經修正了,在Gh0st里,可以看到很多這樣的代碼。只要把在

6、for或if里面定義的變量,放到for或if之前定義就好了。這里的代碼是:for (CSubclassWnd* p = theHookMap.Lookup(m_hWnd); p; p=p->m_pNext)修改為CSubclassWnd* p = NULL; for (p = theHookMap.Lookup(m_hWnd); p; p=p->m_pNext) 后面的i也是一樣修改。gh0st3.6gh0stcj60libcj60libcoolmenu.cpp(803): error C2065: “i”: 未聲明的標識符for (i=0; i < nFound; i+)

7、這里的i,是在前面的 for (UINT i=0; i< nItem; i+) 里面定義的,只要把for里面的i放到for之前定義就可以了,修改如下:UINT i=0; for (i=0; i< nItem; i+)這樣的錯誤修改,以后不再寫出,因為實在是太多了,修改方法也很簡單。1.1.5gh0st3.6gh0stcj60libcj60libcoolmenu.cpp(76): error C4430: 缺少類型說明符 假定為 int。注意: C+ 不支持默認 int在VC6.0里,用修飾符申明的變量可以不現(xiàn)式的寫出變量類型,默認類型為int。如這里的const CXGAP = 1

8、; 等于 const int CXGAP = 1; 但是VS2010必須現(xiàn)式的指出,不能省略。所以修改方法就是現(xiàn)式的寫上定義類型。/ constants used for drawing const CXGAP = 1; / num pixels between button and text const CXTEXTMARGIN = 2; / num pixels after hilite to start text const CXBUTTONMARGIN = 2; / num pixels wider button is than bitmap const CYBUTTONMARGIN

9、= 2; / ditto for height 修改如下: / constants used for drawing const int CXGAP = 1; / num pixels between button and text const int CXTEXTMARGIN = 2; / num pixels after hilite to start text const int CXBUTTONMARGIN = 2; / num pixels wider button is than bitmap const int CYBUTTONMARGIN = 2; / ditto for he

10、ight這個在Gh0st里有,以后這個錯誤也不在指出。1.1.6接下來要解決的就是一大堆的重定義錯誤了1>c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(126): error C2011: “tagSFBS_FLAGS”:“enum”類型重定義1> c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(126) : 參見“tagSFBS_FLAGS”的聲明1>c:program filesmicrosoft sdkswindowsv7.0ainc

11、ludeshlwapi.h(251): error C2084: 函數(shù)“HRESULT SHLocalStrDupW(LPCWSTR,LPWSTR *)”已有主體 1> c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(250) : 參見“SHLocalStrDupW”的前一個定義1>c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(256): error C2084: 函數(shù)“HRESULT SHLocalStrDupA(LPCSTR,LPSTR *)

12、”已有主體1> c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(255) : 參見“SHLocalStrDupA”的前一個定義1>c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(860): error C2365: “URL_SCHEME_INVALID”: 重定義;以前的定義是“枚舉數(shù)”1> c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(860) : 參見“URL_SCH

13、EME_INVALID”的聲明1>c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(861): error C2365: “URL_SCHEME_UNKNOWN”: 重定義;以前的定義是“枚舉數(shù)”1> c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(861) : 參見“URL_SCHEME_UNKNOWN”的聲明1>c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(862): e

14、rror C2365: “URL_SCHEME_FTP”: 重定義;以前的定義是“枚舉數(shù)”1> c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(862) : 參見“URL_SCHEME_FTP”的聲明1>c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(863): error C2365: “URL_SCHEME_HTTP”: 重定義;以前的定義是“枚舉數(shù)”1> c:program filesmicrosoft sdkswindowsv7.0a

15、includeshlwapi.h(863) : 參見“URL_SCHEME_HTTP”的聲明1>c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(864): error C2365: “URL_SCHEME_GOPHER”: 重定義;以前的定義是“枚舉數(shù)”1> c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(864) : 參見“URL_SCHEME_GOPHER”的聲明1>c:program filesmicrosoft sdkswindows

16、v7.0aincludeshlwapi.h(865): error C2365: “URL_SCHEME_MAILTO”: 重定義;以前的定義是“枚舉數(shù)”1> c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(865) : 參見“URL_SCHEME_MAILTO”的聲明1>c:program filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(866): error C2365: “URL_SCHEME_NEWS”: 重定義;以前的定義是“枚舉數(shù)”1> c:prog

17、ram filesmicrosoft sdkswindowsv7.0aincludeshlwapi.h(866) : 參見“URL_SCHEME_NEWS”的聲明造成這個原因是ATL和CJLIB庫的兼容性問題上,從錯誤上看是shlwapi.h里的代碼被重定義了,ATL在定義前都會判斷一下是否已經定義,而CJLIB則沒有判斷。解決方法是把CJLIB中的shlwapi.h包含給注釋掉。可以在當前項目搜索shlwapi.h,一共有兩處。E:ProgrammingVS2010Gh0st3.6gh0stCJ60LibIncludeModulVer.h E:ProgrammingVS2010Gh0st3.

18、6gh0stCJ60LibIncludeShellTree.h把其中的 #include <Shlwapi.h> 改成 /#include <Shlwapi.h> 重新編譯后,錯誤一下少了很多,看起來也清爽了許多。1.1.7gh0st3.6gh0stcj60libcj60libcjsizedockbar.cpp(89): error C2440: “static_cast”: 無法從“UINT (_thiscall CCJSizeDockBar:* )(CPoint)”轉換為“LRESULT (_thiscall CWnd:* )(CPoint)” 1> 從基類型

19、到派生類型的強制轉換需要 dynamic_cast 或 static_cast這句話定位到的是ON_WM_NCHITTEST(),其實就是消息響應函數(shù)的返回值類型不匹配,這里也可以看出VS2010和VC6.0的不同。ON_WM_NCHITTEST對應的消息函數(shù)是UINT CCJSizeDockBar:OnNcHitTest(CPoint point) ,把返回值類型改下就好了。有兩處:E:ProgrammingVS2010Gh0st3.6gh0stCJ60LibCJ60LibCJSizeDockBar.cpp UINT CCJSizeDockBar:OnNcHitTest(CPoint poi

20、nt) 修改為: LRESULT CCJSizeDockBar:OnNcHitTest(CPoint point) E:ProgrammingVS2010Gh0st3.6gh0stCJ60LibIncludeCJSizeDockBar.h afx_msg UINT OnNcHitTest(CPoint point); 修改為: afx_msg LRESULT OnNcHitTest(CPoint point); 后面還有一個一樣的錯誤,只是所在類不一樣,修改方法還是一樣的gh0st3.6gh0stcj60libcj60libcjcontrolbar.cpp(155): error C2440:

21、 “static_cast”: 無法從“UINT (_thiscall CCJControlBar:* )(CPoint)”轉換為“LRESULT (_thiscall CWnd:* )(CPoint)” 1> 從基類型到派生類型的強制轉換需要 dynamic_cast 或 static_cast這里就不再說了,請參考上面的修改。VS2010編譯Gh0st3.6 (一)續(xù)1.1.8gh0st3.6gh0stcj60libcj60libcjpagerctrl.cpp(75): error C2440: “static_cast”: 無法從“BOOL (_thiscall CCJPagerC

22、trl:* )(NMPGSCROLL *,LRESULT *)”轉換為“BOOL (_thiscall CCmdTarget:* )(NMHDR *,LRESULT *)” 1> 在匹配目標類型的范圍內沒有具有該名稱的函數(shù) gh0st3.6gh0stcj60libcj60libcjpagerctrl.cpp(76): error C2440: “static_cast”: 無法從“BOOL (_thiscall CCJPagerCtrl:* )(NMPGCALCSIZE *,LRESULT *)”轉換為“BOOL (_thiscall CCmdTarget:* )(NMHDR *,LRE

23、SULT *)” 1> 在匹配目標類型的范圍內沒有具有該名稱的函數(shù)這兩處的錯誤都是一樣的,都是同一種參數(shù)類型不匹配。定位信息:ON_NOTIFY_REFLECT_EX(PGN_SCROLL, OnPagerScroll) ON_NOTIFY_REFLECT_EX(PGN_CALCSIZE, OnPagerCalcSize)可以看出他們所對應的函數(shù)分別是OnPagerScroll和OnPagerCalcSize。直接在上面按F12(右鍵跳轉到定義處)就跳轉到函數(shù)定義出了。E:ProgrammingVS2010Gh0st3.6gh0stCJ60LibCJ60LibCJPagerCtrl.cp

24、p BOOL CCJPagerCtrl:OnPagerScroll(NMPGSCROLL* pNMPGScroll, LRESULT* pResult) *pResult = 0; return FALSE; / Let parent handle message 修改如下: BOOL CCJPagerCtrl:OnPagerScroll(NMHDR* pNMPGScroll, LRESULT* pResult) *pResult = 0; return FALSE; / Let parent handle message = BOOL CCJPagerCtrl:OnPagerCalcSize

25、(NMPGCALCSIZE* pNMPGCalcSize, LRESULT* pResult) switch(pNMPGCalcSize->dwFlag) 修改如下: BOOL CCJPagerCtrl:OnPagerCalcSize(NMHDR* pNMHDRPGCalcSize, LRESULT* pResult) NMPGCALCSIZE *pNMPGCalcSize = (NMPGCALCSIZE *)pNMHDRPGCalcSize; switch(pNMPGCalcSize->dwFlag) =接著修改頭文件中申明的參數(shù)類型 E:ProgrammingVS2010Gh0

26、st3.6gh0stCJ60LibIncludeCJPagerCtrl.h virtual BOOL OnPagerScroll(NMPGSCROLL* pNMPGScroll, LRESULT * pResult); virtual BOOL OnPagerCalcSize(NMPGCALCSIZE * pNMPGCalcSize, LRESULT* pResult); 修改如下: virtual BOOL OnPagerScroll(NMPGSCROLL* pNMPGScroll, LRESULT * pResult); virtual BOOL OnPagerCalcSize(NMHDR

27、* pNMHDRPGCalcSize, LRESULT* pResult);1.2 編譯CJ60Lib首先還是修改字符集為ANSI,默然不為WChar_t。這步是編譯Gh0st每一個項目都需要做的,以后的操作中不再提起,請注意。如果提示A函數(shù)和W函數(shù)重定義,參數(shù)沖突等,都是這個問題,改下項目屬性就能解決了。這個直接編譯就能過了。用VS2010編譯函數(shù)很多安全函數(shù)的警告,這個不用管他,想修改也是可以的。還有一個_WIN32_WINNT宏未定義的警告,如非必要,我就不加上去了,盡量的保持和原版的相同。要加的話,直接加在每個項目的StdAfx.h里面。格式:#define _WIN32_WINNT

28、0×0500 這里的參數(shù)含義可以參看MSDN,后面有一處修改必須加,也會再次提到。VS2010編譯Gh0st3.6(二)二編譯Gh0st成功編譯CJ60Lib界面庫之后,就可以開始編譯Gh0st了。2.1 轉換Gh0st3.6項目直接用VS2010打開Gh0st3.6gh0st.dsw 提示轉換項目,確定轉換就行了。這里一共三個項目:gh0st,install,svchost。編譯的時候需要先編譯svchost再編譯install,最后才編譯gh0st。 2.2 編譯svchost相同的錯誤修改就不再說了,參看前面的修改方法。 修改已說過的錯誤,再繼續(xù)下面的錯誤修改。2.2.11&g

29、t;commonFileManager.cpp(202): error C2440: “初始化”: 無法從“const char *”轉換為“char *” 1> 轉換丟失限定符char *lpExt = strrchr(lpFile, .); 修改為: const char *lpExt = strrchr(lpFile, .); 1>e:programmingvs2010gh0st3.6serversvchostcommonloop.h(160): error C2440: “=”: 無法從“const char *”轉換為“char *” 1> 轉換丟失限定符char

30、*lpFileName = NULL; lpFileName = strrchr(lpURL, /) + 1; 修改為:const char *lpFileName = NULL; lpFileName = strrchr(lpURL, /) + 1; 2.2.21>commonScreenSpy.cpp(355): error C2062: 意外的類型“int”for (int i = 0, int nToJump = 0; i < nHeight; i += nToJump) 修改為: for (int i = 0, nToJump = 0; i < nHeight; i

31、 += nToJump) 2.2.31>commonVideoManager.cpp(123): error C4430: 缺少類型說明符 假定為 int。注意: C+ 不支持默認 int定位在: static dwLastScreen = GetTickCount(); 這個錯誤前面已經提到過,是添加現(xiàn)式定義類型int。這里添加現(xiàn)式類型為 DWORD 比較好,因為后面的函數(shù)GetTickCount返回值是DWORD類型。在這里修改如下: static DWORD dwLastScreen = GetTickCount(); 2.2.41>commonScreenManager.c

32、pp(7): fatal error C1083: 無法打開包括文件:“winable.h”: No such file or directoryWinable頭文件從VS2008里面就已經不存在了,MSDN里描述如下:從 Visual Studio 早期版本升級項目時,您可能必須修改 WINVER 和 _WIN32_WINNT 宏,以便它們大于或等于 0×0500。 已移除 Windows API 頭文件 Winable.h。而改為包括 Winuser.h。因為Winuser默認已經包含進來了,所以直接注釋這句話就行了。但是如果直接這樣,引用Winable中的函數(shù)就會出現(xiàn)未定義錯誤

33、。所以這里除了需要注釋這個頭文件包含,還需要注釋這個文件中的_WIN32_WINNT宏定義,或者修改宏定義大于等于500。我這里直接注釋掉了。#define _WIN32_WINNT 0×0400 #include "ScreenManager.h" #include "until.h" #include <winable.h> / BlockInput 修改為: /#define _WIN32_WINNT 0×0400 #include "ScreenManager.h" #include "

34、;until.h" /#include <winable.h> / BlockInput 2.3 編譯install這個能直接編譯通過,就算不修改默認字符集,但還是建議和前面一樣,修改下默然字符。2.4 編譯gh0st一開始編譯就會有個錯誤提示而終止,如果不修改沒法正常編譯。1>C:Program FilesMicrosoft Visual Studio 10.0VCatlmfcincludeafx.h(24): fatal error C1189: #error : Building MFC application with /MDd (CRT dll versi

35、on) requires MFC shared dll version. Please #define _AFXDLL or do not use /MDd這個還是需要修改屬性頁。需要把代碼生成里的運行時庫改成/MT。如圖:修改之后重新編譯就能看到很多錯誤了。在繼續(xù)下面的錯誤修改之前,先把前面講到的錯誤類型給修改好。2.4.11>controlBtnST.cpp(4): fatal error C1083: 無法打開包括文件:“stdafx.h”: No such file or directory提示找不到stdafx.h,其實這個文件是存在的。在屬性里添加“./”的包含目錄就能解決了

36、。 在屬性頁的C/C+GeneralAdditional Include Directories 里添加。原來的是: CJ60lib/Include;./common;%(AdditionalIncludeDirectories)修改后為: ./;CJ60lib/Include;./common;%(AdditionalIncludeDirectories)如圖:2011-06-30 16:38 VS2010編譯Gh0st3.6(二)續(xù)2.4.21>e:programmingvs2010gh0st3.6gh0stTmSchema.h(27): error C2011: “BGTYPE”:

37、“enum”類型重定義 1> C:Program FilesMicrosoft SDKsWindowsv7.0Aincludevssym32.h(14) : 參見“BGTYPE”的聲明 1>e:programmingvs2010gh0st3.6gh0stTmSchema.h(33): error C2011: “IMAGELAYOUT”:“enum”類型重定義 1> C:Program FilesMicrosoft SDKsWindowsv7.0Aincludevssym32.h(25) : 參見“IMAGELAYOUT”的聲明 1>e:programmingvs201

38、0gh0st3.6gh0stTmSchema.h(38): error C2011: “BORDERTYPE”:“enum”類型重定義 1> C:Program FilesMicrosoft SDKsWindowsv7.0Aincludevssym32.h(35) : 參見“BORDERTYPE”的聲明 1>e:programmingvs2010gh0st3.6gh0stTmSchema.h(44): error C2011: “FILLTYPE”:“enum”類型重定義 1> C:Program FilesMicrosoft SDKsWindowsv7.0Aincludev

39、ssym32.h(46) : 參見“FILLTYPE”的聲明 1>e:programmingvs2010gh0st3.6gh0stTmSchema.h(52): error C2011: “SIZINGTYPE”:“enum”類型重定義 1> C:Program FilesMicrosoft SDKsWindowsv7.0Aincludevssym32.h(59) : 參見“SIZINGTYPE”的聲明 1>e:programmingvs2010gh0st3.6gh0stTmSchema.h(58): error C2011: “HALIGN”:“enum”類型重定義 1&g

40、t; C:Program FilesMicrosoft SDKsWindowsv7.0Aincludevssym32.h(70) : 參見“HALIGN”的聲明 1>e:programmingvs2010gh0st3.6gh0stTmSchema.h(64): error C2011: “CONTENTALIGNMENT”:“enum”類型重定義 1> C:Program FilesMicrosoft SDKsWindowsv7.0Aincludevssym32.h(81) : 參見“CONTENTALIGNMENT”的聲明 1>e:programmingvs2010gh0s

41、t3.6gh0stTmSchema.h(70): error C2011: “VALIGN”:“enum”類型重定義又是一堆的類型重定義錯誤,這次需要現(xiàn)式的指出Windows版本才能解決這個問題。打開stdafx.h,在其中添加 #define _WIN32_WINNT 0×0500 。下面是我的操作,實際放置的位置可以自己調整。E:ProgrammingVS2010Gh0st3.6gh0stStdAfx.h#define VC_EXTRALEAN / Exclude rarely-used stuff from Windows headers #include <afxwin

42、.h> / MFC core and standard components #include <afxext.h> / MFC extensions #include <afxcview.h> 修改如下: #define VC_EXTRALEAN / Exclude rarely-used stuff from Windows headers #define _WIN32_WINNT 0×0500 #include <afxwin.h> / MFC core and standard components #include <afxe

43、xt.h> / MFC extensions #include <afxcview.h> 這里就說下參數(shù)的含義,0×0500是指Windows 2000,這個宏定義說明這個程序只是要在Windows 2000 及以上的操作系統(tǒng)上才能正常運行。0×0501 Windows XP、0×0502 Windows Server 2003、 0×0600 Windows Vista、0×0601 Windows 7。2.4.31>TrueColorToolBar.cpp(42): error C2440: “static_cast

44、”: 無法從“void (_thiscall CTrueColorToolBar:* )(NMTOOLBARA *,LRESULT *)”轉換為“void (_thiscall CCmdTarget:* )(NMHDR *,LRESULT *)” 1> 在匹配目標類型的范圍內沒有具有該名稱的函數(shù)這個和1.1.8是一樣的。這里再說下。定位到: ON_NOTIFY_REFLECT(TBN_DROPDOWN, OnToolbarDropDown)可以在OnToolbarDropDown上點右鍵跳轉到定義(F12),跳轉到申明(Ctrl+Alt+F12)E:ProgrammingVS2010Gh

45、0st3.6gh0stTrueColorToolBar.cppvoid CTrueColorToolBar:OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr) for (int i = 0; i < m_lstDropDownButton.GetSize(); i+) 修改如下:void CTrueColorToolBar:OnToolbarDropDown(NMHDR* NMHDRpnmtb, LRESULT *plr) NMTOOLBARA *pnmtb = (NMTOOLBARA *)NMHDRpnmtb; for (int i =

46、0; i < m_lstDropDownButton.GetSize(); i+) E:ProgrammingVS2010Gh0st3.6gh0stTrueColorToolBar.hafx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);修改如下:afx_msg void OnToolbarDropDown(NMHDR* NMHDRpnmtb, LRESULT* plRes); 2.5Gh0st就只有這些錯誤了。下一節(jié)將講解連接錯誤。VS2010編譯Gh0st3.6(三)三解決連接錯誤到現(xiàn)在為止,所以代碼已經沒有任

47、何錯誤了,但在Gh0st還是編譯不成功,而錯誤全部是在連接錯誤上。下面來解決掉這些鏈接錯誤。3.1 CJ60StaticLib鏈接庫錯誤首先我們看到的是CJ60StaticLib的鏈接錯誤1>CJ60StaticLib.lib(CJListView.obj) : error LNK2001: 無法解析的外部符號 “protected: static struct AFX_MSGMAP const CListView:messageMap” ()1>CJ60StaticLib.lib(CJListView.obj) : error LNK2001: 無法解析的外部符號 “public

48、: _thiscall CString:CString(void)” ()1>CJ60StaticLib.lib(CJListCtrl.obj) : error LNK2001: 無法解析的外部符號 “public: _thiscall CString:CString(void)” ()1>CJ60StaticLib.lib(CJListView.obj) : error LNK2019: 無法解析的外部符號 “public: void _thiscall CString:Empty(void)” (?EmptyCStringQAEXXZ),該符號在函數(shù) “public: _thi

49、scall CCJListView:CCJListView(void)” (?0CCJListViewQAEXZ) 中被引用1>CJ60StaticLib.lib(CJListCtrl.obj) : error LNK2001: 無法解析的外部符號 “public: void _thiscall CString:Empty(void)” (?EmptyCStringQAEXXZ)從錯誤上看,gh0st鏈接的是CJ60StaticLib.lib庫,但是前面我們編譯的CJ60StaticLib產生的庫卻是CJ60StaticLibd.lib,是CJ60StaticLib的Debug版本的庫,

50、這里鏈接的卻是Release版的庫。不信可以看下CJ60StaticLib的生成目錄:E:ProgrammingVS2010Gh0st3.6gh0stCJ60LibLib看些日期也就知道,我們前面編譯的文件名后面都多了d。從新打開CJ60StaticLib項目。E:ProgrammingVS2010Gh0st3.6gh0stCJ60LibCJ60LibCJ60Lib.sln可以直接在界面上的修改成Release,或在項目屬性里點配置成Release。如下圖:或者:修改后如果直接這樣編譯,會出現(xiàn)類似下面的錯誤:1>ShellPidl.cpp(220): error C2664: “Mult

51、iByteToWideChar”: 不能將參數(shù) 5 從“USHORT *”轉換為“LPWSTR”1> 與指向的類型無關;轉換要求 reinterpret_cast、C 樣式轉換或函數(shù)樣式轉換一看就知道是默認字符集問題,前面只在Debug模式下修改了默認不是WChar_t類型,而切換到Release模式也要記得修改。重新修改,編譯CJ60StaticLib和CJ60Lib。再來看下生成目錄。E:ProgrammingVS2010Gh0st3.6gh0stCJ60LibLib3.2 gh0st鏈接錯誤現(xiàn)在再來編譯一次gh0st,鏈接錯誤是不是沒有出現(xiàn)在CJ60StaticLib上了1>C:Program FilesMSBuildMicrosoft.Cppv4.0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論