隨着軟件對計算機主存的需求的擴張,32位平台的4G主存尋址空間逐漸成為機器性能的瓶頸,長期來看,解決這一矛盾的最優方案是使用支持更大主存空間的軟件運行平台。就當前來所,PC機上支持更大地址空間的硬件平台就是x64了,當然除了硬件外還需要64位的操作系統和運行時庫的支持,才能運行64位的應用程序,本文將主要講解windows環境下的軟件如何升級至x64版本。
1. 准備工作
為了保證升級過程順利進行,需要一些資源。
1.1 目標平台
為了運行和測試64位的軟件,需要相應的支撐平台。
硬件:需要支持64位運算的處理器如amd64構架或Intel 64構架。
操作系統:64位操作系統,這里只討論windows平台,微軟從windows xp以后所有的操作系統都有相應的64位版本,本文以Windows XP 64bit Edition為例。目標操作系統可以安裝在物理機器上,也可以使用虛擬機安裝,當然硬件都必須支持64位才可以,另使用虛擬機安裝64位系統時,需要處理器支持虛擬化技術。
運行時庫:需要64位運行時庫,這可以從編譯環境獲得。
1.2 編譯器
這里需要到目標平台的編譯器,即x64編譯器,編譯器本身不一定是64位的;除編譯器外,對應的開發庫和頭文件也是必須的,為了方便,最好使用集成開發環境,如visual Studio,自vs2005后開始有64位編譯器(vs本身是32位的),但默認不會安裝,如果已安裝vs2008(或2005/2010),則通過重新運行安裝程序添加刪除功能,添加x64編譯器即可,如下圖:
2. 配置x64編譯選項
2.1 增加x64目標平台
打開需要移植的項目,在解決方案管理器中,項目節點單擊右鍵選擇屬性,打開項目屬性對話框,並打開配置管理器,如下圖:
在“活動解決方案平台”下拉列表中選擇新建,打開“新建解決方案平台”對話框:
在新的平台中選擇x64,並從現有win32平台復制且創建新的項目平台,單擊確定,即完成平台的創建。
2.2 配置x64編譯屬性
在上述新建立的平台配置中,為了簡化配置工作,我們是從現有Win32平台配置拷貝而來,所以在建立完成后,我們仍需要對新建的編譯配置做部分修改,在創建新的目標平台前,軟件有兩個編譯配置debug和release,均為win32平台的編譯配置;在建立新的平台后,就會組合出新的編譯配置,即針對x64的debug和release版本,如下圖:
所以修改x64編譯屬性時,就需要同時修改對應的debug和release配置了(如果之前還有其他編譯配置,此處也要對應修改),下面以Debug|x64為例說明配置的修改:
預處理器:將宏WIN32改為_WIN64,如下圖:
第三方庫目錄指向x64版本庫目錄,當軟件使用了vs庫以外的第三方庫時,需要相應的庫的x64版本,包括導入庫(動態鏈接時):
3. 編譯調試
通過2已經建立起x64平台的編譯配置,接下來通過編譯可以看到當前代碼在新的平台中的錯誤,但為了不影響之前平台的版本,我們不宜貿然修改之前的代碼,建議采取之下方式,將x64和win32代碼隔離:
#ifdef _WIN64
//x64代碼
…
#else
//win32代碼
…
#endif
當然,如果是因為類型長度的變化導致的錯誤,可以使用VS頭文件中定義的通用的類型來消除這種錯誤。
4. 移植過程中可能遇到的問題
在新的平台配置下編譯時,難免會出現一些錯誤,其中有些錯誤是由於內部類型的變化導致的(如截斷,使用int表示指針等等),這種平台差異導致的語法錯誤可以通過修改相關變量定義很快修正,但有些依賴性問題可能需要更多方面的參與才能得到較好的解決,下面列出一些常見的問題,及其解決辦法。
4.1 找不到第三方庫
這中情況可能發生在鏈接階段,也可能發生在運行階段,都是鏈接錯誤,其原因是工程或程序依賴的庫文件沒找到,或找到的不是目標平台版本的庫。
解決辦法:檢查工程選項中的鏈接選項,確保附加庫參數指向正確的路徑;找到工程所依賴的庫文件的x64版本(包括導入庫),將其放到指定目錄中;
如果可以獲得所需要的庫的源碼,則可以編譯得到其x64庫(這是個遞歸過程),否則需要尋求該庫的提供者,索取x64版本的庫,如果這兩條路都走不通,則要么自己實現軟件中所使用的庫的特定功能,要么將對應的庫換成另一種支持x64平台的具有相同功能的庫。
4.2 軟件某些界面無法顯示
這都是運行時錯誤,這種情況可能是該界面使用的控件沒有安裝,可以通過Depends(x64版本的)工具查看所缺失的控件,解決方法和4.1相同。
需要注意的是有些常用控件到目前為止還沒有x64版本,如微軟的msflexgrid控件沒有x64版本的,以及同樣功能的vsflexgrid也不支持x64平台(至2010年底時),如果你的界面中使用了這些控件而又不得不移植到x64平台時,你可能需要調整界面了,使用其他控件代替,或聯系本文作者(僅限於flexgrid控件)。
4.3 Access數據庫
如果軟件中使用了access數據庫,在x64版本的軟件必須使用x64版本的access數據庫驅動程序,很遺憾,微軟似乎並不打算提供x64版本的access數據庫驅動程序,同樣的,您需要采取其他措施繞過這個難點,這里提供兩個思路:
a. 將數據訪問部分隔離到單獨程序中,此程序使用win32版本,然后主程序的進程通過ipc與數據庫訪問進程通信獲取數據,這樣會影響性能,慎用。
b. 使用其他支持x64平台的數據庫,同樣可能需要調整數據庫訪問部分代碼,可能會增加軟件成本。
4.4 X64准則
前面所提到的3個問題都是違法一下“准則”所導致的,所以在x64軟件運行失敗而對應的win32版本運行良好時,請使用下面的准則,檢查是否有違背的地方。
同一個進程空間只能運行一個平台的代碼,win32進程只能運行32位代碼,x64進程空間只能運行x64代碼。
這就決定了x64程序所依賴的所有模塊都必須是x64版本的,才能正常運行。
5. 有用的小工具
5.1 任務管理器
由於在x64平台上,既可以運行win32程序(通過WOW模擬器),也可以運行x64程序,通過x64操作系統的任務管理器,區分當前運行的軟件是x64版本還是win32版本:
上圖中,可以看到同時運行了兩個掃雷程序,其中一個是win32版本,另一個是x64版本,可以看到,任務管理器通過進程名對二者加以區分,凡是32位程序,其進程名后都以“*32”標記,而x64程序的進程名則正常。
5.2 Dependency Walker
Dependency Walker是開發中常用的工具,用於查看程