使用VC6.0在32位平臺上開發64位程序

從32位應用程序到64位應用程序

編譯:starlight

原文 porting 32-bit to 64-bit on Xeon

  這篇文章主要是講述如何將已有的32位程序編譯成爲64位程序, 並簡單講述如何遠程調試64位應用程序, 以及在其中可能遇到的問題, 其中譯註補充部分爲自已的實踐經驗, 如有出入或其它解決方案, 歡迎指正.

  本文一步一步地描述了怎樣使用Microsoft Visual Studio IDE創建64位應用程序, 並且,64位的應用程序代碼和32位應用程序代碼完全一樣, 只是編譯環境配置有所不同。目前還沒有發現有純64位的IDE應用程序開發環境。筆者翻譯本文時,Microsoft已在VS.NET2002/2003/2005/2008 IDE中提供了64位創建環境 ,但完全的64位IDE開發環境似乎還沒有。有興趣的朋友可以看下:

http://blogs.msdn.com/deeptanshuv/archive/2006/04/11/573795.aspx
http://forums.msdn.microsoft.com/en-US/netfx64bit/threads/

  當前的軟件開發包(應該是指Microsoft SDK 2003 server RC2)包括了專爲64位應用程序開發的編譯器,鏈接器, 和其它的工具. 同樣, 這個SDK包含了C運行時庫(CRT), 微軟基礎類庫(MFC), 和活動模板庫(ATL), 這些均是64位的產品版本. 你可以用Visual C++ 6.0 或者 Visual C++ .NET IDE創建64位的應用程序。如果你有一個32位的應用程序並且你想移植它到64位應用程序, 這篇文章描述了怎樣在同一個工程中創建一個64位的 配置環境。

一些必要條件

這下面的列表描述了推薦的硬件, 軟件, 網絡以及Service pack:
Microsoft 平臺 SDK (2001/11月) 或最近發佈的Microsoft 平臺 SDK: 推薦使用2003 SDK RC2版本, 下載地址:

http://download.microsoft.com/download/0/8/3/0839ce16-0523-4407-9432-01958ee61aff/VS2008TeamSuite90DayTrialCHSX1429243.part1.rar
......
http://download.microsoft.com/download/0/8/3/0839ce16-0523-4407-9432-01958ee61aff/VS2008TeamSuite90DayTrialCHSX1429243.part7.rar

Visual C++ 6.0 或者 Visual C++ .NET (2002 or 2003 or 2005 or 2008 )

用Visual C++ 6.0 IDE創建一個64位應用程序

設置64位創建環境變量, 用下面任何一種方式都行:

方式一:

點擊”開始”菜單, 指向 “Microsoft Platform SDK” > “Open Build Environment Windows” > “Set Windows XP 64 Build Environment”, 然後點擊”Set Windows XP 64 Build Environment (Debug)”, 這時, 一個控制檯窗口將顯示, 一行文本顯示像” the build environment set for a 64-bit”.

方式二:

在命令提示符下,
1. 點擊”開始”菜單, 然後點擊”運行”

2. 鍵入”command.exe”(沒有引號), 然後, 點擊”確定” 

3. 變化當前目錄到C:/Program Files/Microsoft SDK(你的SDK安裝目錄), 然後鍵入”SetEnv.bat /XP64”(沒有引號)

現在, 開始啓動Visual C++ 6.0並用我們剛纔配置好的創建環境

1. 在同一個命令窗口中(也就是你剛纔設置64位環境的命令行窗口), 打開Visual Studio.

2. 鍵入 “Msdev /useenv”(沒有引號). 請注意, 不要打開一個新的命令行窗口, 再去打開Msdev.exe, 現在Visual C++ 6.0 IDE已經顯示, 並且include, library及executable目錄均被設置爲64位的創建環境(注:查看這些配置, 點擊Tools > Options > Directories, 在”Show directories for: “下拉列表中查看相應目錄配置). 
另外, 如果Msdev.exe不在當前路徑下(通常是系統環境變量沒有相應指示), 變化目錄到你所安裝Visual Studio的目錄下, 例如: /Microsoft Visual Studio/Common/Msdev98/Bin, 然後, 再鍵入Msdev.exe.

譯註: 在前面的設置64位創建環境變量 , 已經將IDE的executable執行目錄調整到SDK的相應目錄下面, 也就是說, 作爲可執行程序: 編譯器和鏈接器是在SDK目錄中, 而不再是默認的/Microsoft Visual Studio/Common/Msdev98/Bin

添加一個64位Debug配置

1. 在Visual C++ IDE中, 打開一個已經在的32位工程(例如: MyApplication)

2. 在”Build”菜單上, 點擊”Configurations”.

3. 在”Configurations”對話框上, 點擊”Add”.

4. 在”Add Project Configuration”對話框上, 設置”Configuration”到Debug64, 然後, 在”Copy Settings from”列表框中點擊”MyApplication – Win32 Debug”

5. 點擊”OK”完成設置, 點擊”Close”關閉.

設置激活配置爲64位

1. 在”Build”菜單上, 點擊”Set Active Configuration”.

2. 點擊”MyApplication – Win32 Debug64”, 然後, 點擊”OK”.

修改編譯器和鏈接器的參數配置

由於64位的編譯器和鏈接器的參數配置和32位的有些不一樣, 我們需要修改部分選項, 下面是這些配置步驟:
1. 在”Project”菜單中,點擊”Settings”.

2. 在”Project Settings”對話框中, 點擊”General”標籤. 在”Output directories”, 在”Intermediate files” 和”Output files”輸入框中, 鍵入”Debug64”(沒有引號)

3. 在”C/C++”標籤上, 在”Debug info”下拉列表中, 選擇”Program database(參數選項對應是 /Zi)

4. 在”Link”標籤上, 在”Project options”的輸入框中, 變化”/machine:I386”(沒有引號)到”/machine:IA64”(沒有引號)

譯註: 正確設置應是: /machine:AMD64

5. 在”View”菜單上, 點擊”Workspace”.

6. 然後, 移除幫助文件MyApplication.hpj

7. 如果你的應用程序是基於MFC的, 你必須添加一個MFC路徑以避免鏈接錯誤:LNK1004 on the Mfc42d.lib, 請按下面步驟操作:
  a. 在”Tools”菜單上, 點擊”Options”.

  b. 在”Directories”標籤上, 在”Show directories”下拉列表中, 選擇”Library Files”, 現在添加你的平臺庫所在路徑: ”/Microsoft SDK/lib/IA64/mfc”(沒有引號)

譯註補充: 在”C/C++”標籤上, 在”Preprocessor definitions”輸入框中將WIN32改成WIN64

創建並調試這個工程

  1. 現在Build這個工程, 生成64位應用程序, 這個應用程序被部署在一個IA64計算機上.
  2. 要在Visual C++ 6.0中運行這個.exe文件, 按下面步驟:
    注意: 你不能夠在Visual C++ 6.0 IDE中調試這個.exe文件.
    a. 在你的IA64計算機上, 創建一個文件夾: C:/VC6MSVCMON
    從X86(32位)計算機上拷貝這些文件到這個新創建的文件夾中:

    Msvcmon.exe
    Dm.dll
    Msdis110.dll
    Tln0t.dll

    上面這些文件應在你的Visual C++ 6.0安裝目錄下:
    /Visual Studio/Common/MSDev98/Bin

    b. 在拷貝完這些文件後, 在IA64計算機上運行Msvcmon.exe, 然後, 點擊”Connect”.

    c. 在X86(32位)計算機上, 打開Visual C++ 6.0 IDE, 在”Build”菜單上, 點擊”Debugger Remote Connection”.

    d. 在”Remote Connection”對話框中, 點擊”Network TCP/IP”, 然後, 點擊”Settings”.

    e. 在”Target computer name of address”輸入框中, 鍵入IA64計算機的名稱. 點擊”ok”兩次, 關閉對話框.

    f. 在Visual Studio C++ IDE中, 在”Project”菜單上, 點擊”Settings”, 在左側面板, 展開”MyApplication”, 然後, 點擊”Debug”標籤. 你將注意到”Executable for debug session”輸入框包含了MyApplication.exe的路徑, 看起來是C:/<X86Path>/MyApplication.exe.

    g. 在”Remote executable path and file name”輸入框中, 鍵入”MyApplication.exe”(沒有雙引號)所在的全路徑, 這個路徑看起來像: //<X86ComputerName>/C$/<x86Path>/MyApplication.exe(沒有引號).點擊”OK”關閉該窗口.

    h. 按下CTRL+F5或在”Build”菜單上點擊”Execute MyApplication.exe”, 開始運行這個.exe文件, 這個.exe文件現在是運行在IA64計算機上.
    注意:如果MyApplication是一個MFC應用程序並且這個工程用到了MFC相關的.dll文件, 請確信在IA64計算機上, 那些.dll文件從/Microsoft SDK/NoRedist/Win64文件夾中已被拷貝到/System32文件夾中.
    譯註:/Microsoft SDK/NoRedist/Win64存放的是debug和release版本的MFC, ATL相關dll(64位), 實際上你也可以拷貝這些dll文件到你的可執行.exe文件所在同一目錄中.
    這些dll文件是:

    Mfc42d.dll
    Mfco42d.dll
    Msvcrtd.dll

     

譯註補充: 編譯/鏈接中經常遇到的問題:

  • 鏈接出錯, 通常是RTC, cookie錯誤, 參見下面鏈接設置: 
    http://support.microsoft.com/?scid=kb%3Ben-us%3B894573&x=15&y=14
  • 鏈接中如出現 Error Spawing bscmake.exe 
    去掉勾選編譯參數(Project settings > c/c++): Generate Browse Info 
    如果仍不成功, 請仔細檢查在菜單項”Tools” > “Options” , 定位在”Directories”標籤, 選擇”Executable Files”, 在下面的目錄列表中, 將<SDK安裝目錄>/bin路徑放在第一項.(這個目錄中的64位編譯器和鏈接器程序將重載舊的32位設置).
  • 如果你是動態庫和主應用程序鏈接, 必須保持用的是相同運行時庫, 例如: 全部都是Multi-Threads DLL(點擊”Project” > “Settings”, 選擇”C/C++”標籤, 在”Category”下拉列表中選擇”Code Generation”, 在下面”Use runtime library”下拉列表中選擇).

用Visual C++ .NET IDE創建一個64位應用程序

警告: 在已安裝Visual Studio .NET的計算機上, 請不要同時安裝64位版本的WinDbg調試器工具, 請讀平臺SDK的Readme.doc(位置在: C:/Program Files/Microsoft SDK/Bin/Win64/Readme.doc).

設置64位創建環境變量, 用下面任何一種方式都行:

參照前文相同部分.

開始啓動Visual C++ .NET, 並用剛纔我們創建好的64位環境

1. 在64位SDK環境設置的命令行窗口中,打開Visual Studio .NET.

2. 鍵入”devenv /useenv”(沒有引號), 然後, 點擊”OK”. 現在include, library, executable目錄被設置成爲64位SDK所在目錄.

注意: 如果Devent.exe不在當前路徑(通常是在系統環境變量Path中未指定Visual Studio .NET安裝目錄), 請改變文件夾路徑到<Visual Studio .NET安裝目錄>/Microsoft Visual Studio .NET/Common7/IDE, 然後再運行上述命令.
警告:在你運行這個命令後, Visual Studio .NET IDE就被設置成爲64位的開發環境, 如果你想清除這個環境, 在打開一個新的Visual Studio .NET IDE之前, 刪除在C:/Documents and Settings/<Username>/Local Settings/Application Data/Microsoft/VisualStudio/7.0 下的Vccomponents.dat文件.

添加一個64位調試配置

1. 打開一個已存在的32位工程(例如, MyApplication).

2. 在”Build”菜單上, 點擊”Configuration Manager”.

3. 在”Active Solution Configurations”列表中, 點擊”New”.

4. 在”New Solution Configurations”對話框中, 在”Solution Configuration Name”下面選擇”Debug64”(不包含引號), 並且在”Copy Settings From”下面選擇”Debug”.

5. 點擊”OK”.

6. 在”Configuration Manager”對話框中, 在”Active Solution Configuration”列表中, 點擊選擇”Debug64”, 然後點擊”OK”.

修改編譯器和鏈接器設置

由於64位的編譯器和鏈接器的參數配置和32位的有些不一樣, 我們需要修改部分選項, 下面是這些配置步驟:

 

 

1. 在”Solution”(中文:解決方案)瀏覽窗口中, 右鍵”Project”, 然後, 點擊”Properties”.

2. 在”C/C++”節點, 選擇”General”. 設置”Debug Information Format”到”Program Database”(對應的編譯選項是/Zi).

3. 在”C/C++”節點中, 選擇”Code generation”. 設置”Buffer Security Check”到”No”(對應的編譯選項是/GS).

4. 在”Linker”節點, 選擇”Command Line”.在”Additional Options”下面, 添加”/MACHINE:IA64”(沒有引號).

5. 如果你的應用程序是基於MFC的,你必須添加MFC路徑以避免收到鏈接錯誤:LNK1104 on the Mfc42d.lib file.
添加MFC路徑, 按下面步驟:
a. 在”Tools”菜單上, 點擊”Options”.

b. 在”Projects”下面, 選擇”VC++ Directories”. 在”Show directories”列表中, 選擇”Library Files”.如果庫路徑沒有列出, 添加這個庫路徑"/Microsoft SDK/lib/IA64/mfc"(沒有引號).
注意:如果MyApplication是一個MFC應用程序並且這個工程用到了MFC相關的.dll文件, 請確信在IA64計算機上, 那些.dll文件從/Microsoft SDK/NoRedist/Win64文件夾中已被拷貝到/System32文件夾中.
這些dll文件是:
Mfc42d.dll
Mfco42d.dll
Msvcrtd.dll

完成這些後, 就可以build 64位可執行程序了.
調試工程參照Visual C++ 6.0 IDE部分.

更多參考在:
64-Bit Programming with Visual C++ 

64位程序移植問題

發佈了7 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章