从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位应用程序
方式一:
点击”开始”菜单, 指向 “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”(没有引号)
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
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”关闭.
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
译注补充: 编译/链接中经常遇到的问题:
警告: 在已安装Visual Studio .NET的计算机上, 请不要同时安装64位版本的WinDbg调试器工具, 请读平台SDK的Readme.doc(位置在: C:/Program Files/Microsoft SDK/Bin/Win64/Readme.doc).
参照前文相同部分.
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文件.
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位程序移植问题