64bit 開發環境
寫過程式的人都知道,要進行編程,首先要有一個"編寫"代碼的環境,從理論上來說,記事本也可以完成編寫代碼的任務,但一個帶有文法著色、智能感知輸入的整合式開發環境(IDE),往往會令我們事半功倍,以下主要以Microsoft Visual C++ 2005 Express Edition和最新的Platform SDK為例進行講解,分別在Visual C++ 2005 Express Edition中編寫代碼,用Platform SDK編譯;這兩個軟體均為免費軟體,可從微軟的官方網站下載使用,這樣大家都可以有機會親自動手嘗試64位編程。
可能有人會問,那必須要在一個64位平台上開發嗎?答案是不一定,Platform SDK提供了跨平台交叉編譯功能,就是說,可以在32位系統平台上編譯產生程式,而到64位平台上去運行,考慮到普遍情況,本文以32位平台為基礎,來進行64位編程。
安裝Visual C++ 2005 Express Edition和Platform SDK
Visual C++ 2005是微軟今年底推出的Visual Studio.NET 2005中的一個組件,其Express Edition可看作是個人版,可從微軟的官方網站免費下載,無時間使用限制。在安裝之前,程式會要求先安裝Microsoft .NET Framework Version 2.0 Redistributable Package (x86)。安裝程式是基於網路的,安裝時會下載所必須的檔案;如所示,可看到有圖形IDE、Microsoft MSDN 2005 Express Edition、Microsoft SQL Server 2005 Express Edition x86三個安裝可選項,此處只選項安裝了圖形IDE。
以下顯示了安裝過程:
安裝完後的程式主介面如所示,
與前任相比,Visual C++ 2005開始頁中最明顯的一項變化是,可以即時顯示有關Visual C++開發人員的新聞資訊。圖中可見有一功能表項目為"Community"(社區),下拉式功能表之後有提問、檢索等等功能,可見Visual C++ 2005更加重視協作功能,可通過互連網充分利用開發人員社區中的資源。
有了Visual C++ 2005 Express Edition,還不能進行64位程式的開發,此時的Visual C++只能產生32位的控制台程式,不過沒關係,我們只把它當作一個編寫及編譯代碼的高效工具,要產生64位本地代碼,還要安裝Platform SDK。
Microsoft Windows Platform SDK提供了文檔、樣本程式、標頭檔、庫和相應工具,可用作開發Windows下的應用程式,開發出的程式可運行在基於x86、x64和IA64(安騰)處理器的Windows Server 2003 SP1、Windows XP SP2、Windows XP x64 Pro Edition和Windows 2000之上;同時,Platform SDK微軟提供免費下載。如果要開發64位 .NET程式,還必須安裝 .NET Framework 2.0 Software Development Kit (SDK) (x86)。
在Platform SDK的安裝過程中,可依據個人開發的需要選擇所需安裝的項目:
同時,在每一個項目下,都有針對不同64位平台的工具和代碼產生環境設定,如所示:
以筆者電腦安裝的Microsoft Platform SDK for Windows Server 2003 SP1為例,在Windows開始菜單中,可見有Windows 2000、Windows Server 2003 32位和64位、Windows XP 32位和64位,這五項代碼產生環境設定,每個項目下還有調試版(Debug)和零售版(Retail--對應於以前的發布版Release)等子項目。點擊相應的功能表項目,批次檔會設定好合適的庫和標頭檔目錄,並開啟一個命令提示字元視窗,在此視窗中,可調用合適的編譯器和連結器,同時,此Platform SDK中還帶有一個調試器WinDbg,可用於偵錯工具。
下表顯示了Platform SDK安裝之後的檔案目錄結構
| 目錄 |
內容 |
| /Bin Platform |
SDK工具 |
| /Bin/Win64 |
用於產生基於安騰(Itanium)架構應用程式的工具,包括一個x86-IA64的跨平台交叉編譯器 |
| /Bin/Win64/AMD64 |
用於產生基於x64架構應用程式的工具 |
| /Bin/Win64/ia64 |
用於產生基於安騰(Itanium)架構應用程式的工具 |
| /Bin/Win64/x86/AMD64 |
用於產生基於x64架構應用程式的工具,包括一個x86-AMD64的跨平台交叉編譯器 |
| /Help |
Platform SDK文檔 |
| /Include |
標頭檔和IDL檔案,包含ATL、CRT、MFC |
| /Lib |
輸入庫和TLB檔案 |
| /Lib/ia64 |
支援基於安騰(Itanium)架構的輸入庫和TLB檔案 |
| /Lib/AMD64 |
支援AMD64架構的輸入庫和TLB檔案 |
| /License Platform |
SDK許可資訊 |
| /NoRedist/Win64 |
支援安騰(Itanium)架構的DLL和PDB檔案,不可再發布 |
| /NoRedist/Win64/AMD64 |
支援AMD64架構的DLL和PDB檔案,不可再發布 |
| /Redist/Win64 |
支援安騰(Itanium)架構的DLL檔案 |
| /Redist/Win64/AMD64 |
支援AMD64架構的DLL檔案 |
| /Samples Platform |
SDK開發樣本 |
| /Src |
支援64位開發的ATL、CRT、 MFC原始碼 |
編譯器簡介
Platform SDK中的編譯器是微軟公司提供的跨平台交叉編譯器,可運行在基於x86或x64處理器的Windows XP和Windows Server 2003之上,並支援WoW64模擬層,提供跨平台交叉編譯功能:
此編譯器跟隨Platform SDK一同發布,與Visual Studio中的Visual C++編譯器有所不同,下面列出了五點差異,以便大家清楚地區分。
·此PSDK C++編譯器不能用於Visual Studio的整合式開發環境之中,只能用於命令列編譯。
·此PSDK C++編譯器不支援CLR代碼產生。完全支援64位平台CLR代碼產生的編譯器是Visual Studio.NET 2005中的Visual C++編譯器。
·此PSDK C++編譯器可運行在Win64或Win32系統的電腦上。
·此PSDK C++編譯器支援6.0版本的MFC/ATL、STL、CRT。如果想使用Visual Studio 2003中的MFC/ATL、STL、CRT,請聯絡libs7164@microsoft.com,以擷取這些庫。
·此PSDK C++編譯器帶有一些不同的編譯器選項(參見下文)。
因為此處編譯器和連結器的大多數選項都與Visual Studio x86 32位版本上的相同,在此主要描述不同之處:
編譯器選項
| 選項 |
動作 |
| /fp:fast |
產生最快速度的浮點代碼,不能與其他任何/fp:<option>一同使用。 |
| /fp:precise |
產生與IEEE相容並最佳化過的浮點代碼,不能同時使用/fp:fast或/fp:strict,但/fp:except除外。 |
| /fp:strict |
產生保守的浮點代碼,隱含/fp:except。不能同時使用/fp:fast或/fp:precise,但/fp:except- 除外。 |
| /fp:except[-] |
開啟或關閉可靠浮點例外。不能同時使用/fp:fast。 |
| /homeparams |
強制所有的參數寫入堆棧,包括那些通過寄存器傳遞的參數。 |
| /errorReport:<prompt|send|none> |
此選項通過內部編譯器錯誤(ICE)機制設定編譯器的錯誤報表行為。prompt - 通過ICE,提示使用者發送一個錯誤報表給微軟。send - 通過ICE,一個錯誤報表直接發送給微軟。none - 不發送錯誤報表給微軟。 |
| /RTC1 /RTCc /RTCs /RTCu Platform |
SDK不支援運行時檢查。如果需要此項功能,請使用Visual Studio 2005中的編譯器和庫。 |
連結器選項
| 選項 |
動作 |
| loosefpmath.obj |
使用此選項將會為浮點計算開啟FTZ(flush-to-zero)和DAZ(denormals-as-zero)。預設情況下,是不使用此選項,並且FTZ(flush-to-zero)和DAZ(denormals-as-zero)是關閉的。 |
需注意的事項
·iostream不支援__int64:
要避免如下形式的代碼
#include <iostream.h> __int64 i64; void main( ) { cout << i64; } |
·在基於AMD64和x64的編譯器上,已不支援_asm。
下面,我們以一個經典的"Hello world"程式來示範如果在32位平台上,開發64位應用程式。
開啟Microsoft Visual C++ 2005 Express Edition,在"檔案(File)"菜單中,選取"建立(New)"à"工程(Project)",在開啟的對話方塊左邊表單中,選擇工程類型為"Win32"(我們此處不是真的要產生一個Win32類型的程式,而是利用這個自動化過程而已,最終程式為x64類型),輸入工程名,點擊"下一步(Next)" à在此不勾選"使用先行編譯頭precompiled header"à"完成(Finish)",此時可看到已產生一個工程,修改代碼如下:
#include <iostream> using namespace std;int main(int argc, char * argv[]) { cout << "Hello World!" << endl; return 0; } |
在命令提示字元視窗中構建
點擊"開始à所有程式àMicrosoft Platform SDKàOpen Build EnvironmentàWindows XP 64-bit Build EnvironmentàSet Windows XP x64 Build Environment (Retail)",此時可開啟一個命令提示字元視窗,已設定為Windows XP x64應用程式產生環境,在此視窗下產生的程式可運行在Windows XP x64 Edition上。如果要調用編譯器,鍵入cl.exe,要調用連結器,鍵入link.exe。鍵入cl/?、link/? 查看詳細資料。
假設前段範例程式碼的檔案名稱為:first64.cpp,存放在D盤根目錄下。
在命令提示字元視窗中鍵入:cl d:/first64.cpp bufferoverflowU.lib /EHsc,斷行符號。
此處解釋一下為什麼這樣調用編譯命令,預設情況下,cl在編譯完成之後會自動調用link,命令列中帶上/EHsc是為了開啟"C++例外(Exceptions)",以免出現編譯器警告;微軟的編譯器從Visual Studio.NET 2002開始,預設設定了一個編譯選項/GS,其作用是堆棧檢查,以防止堆棧或緩衝區溢位此類問題的發生,即是阻止代碼溢出攻擊,所以必須連結bufferoverflowU.lib庫。其詳細情況如下:
·bufferoverflowU.lib:此函數庫具體實現安全性 cookie 驗證功能,此功能可以在使用者模式中使用,也可以在使用 Win32 API 的應用程式中使用。大多數應用程式將連結到這個函數庫。
·bufferoverflowK.lib:此函數庫具體實現在作業系統核心模式中執行的安全性 cookie 檢查。在核心模式中啟動並執行服務與子系統應該連結到這個庫。
·bufferoverflow.lib:此函數庫具體實現可以在使用者模式中使用的安全性 cookie 驗證功能。不過它與 bufferoverflowU.lib 有所不同,它可以在不使用 Win32 API 的服務與應用程式中使用。
在整合式開發環境中(IDE)構建
首先,點擊"開始à所有程式àMicrosoft Platform SDKàOpen Build EnvironmentàWindows XP 64-bit Build EnvironmentàSet Windows XP x64 Build Environment (Retail)",它會自動化佈建好path、include、lib環境變數。
修改開始菜單中Visual C++ 2005 Express Edition的捷徑,加上啟動參數/useenv,如下"C:/Program Files/Microsoft Visual Studio 8/Common7/IDE/VCExpress.exe" /useenv。
此時啟動Visual C++ 2005 Express Edition的整合式開發環境(IDE),載入前面所建立的工程,選擇"Build"à"Configuration Manager",在Active solution configrration欄中選擇New…
在此時彈出的對話方塊name中輸入x64 Retail,在copy setting from中選擇Release,此處的兩項可根據你所想要產生的工程性質,自由選擇;之所以這樣做的目的,是為了方便在名稱上區分32位與64位工程,同時也不會影響到原有工程的設定。
在編譯產生工程之前,還需做如下設定:
1、 點擊菜單"Project"à"Properties",開啟"Configuration Properties" à"C++" à"General",確定"Detect 64-bit Portability Issues:"為"Yes(/Wp64)",以保證編譯器檢查工程的64位可移植性問題。
2、 開啟"Configuration Properties" à"Linker" à"Input",在第一行"Additional Dependencies:"中加入bufferoverflowU.lib庫。
3、 開啟"Configuration Properties" à"Linker" à"Advanced",把"Target Machine"改為"Not Set";接下來點擊左邊的"Command Line",在"Additional options:"欄中加入"/MACHINE:AMD64"。
點擊"確定"退出,接下來就可以產生工程了;如果產生過程中,提示找不到cl.exe、標頭檔、庫等等之類的資訊,可在菜單"Tools"à"Options…"à"Projects and Solutions"à"VC++ Directories"中檢查有關目錄是否設定正確,構建工程所需的全部相關檔案都位於"C:/Program Files/Microsoft Platform SDK"下。這屬於整合式開發環境(IDE)的使用設定問題,不少文章都有介紹,此處不再贅述。
現在,你也可以編寫64位應用程式了,是不是很簡單呢;Visual C++ 2005與Platform SDK已經為64位編程做好了準備,你呢?