跨入64位编程的新世纪

跨入 64 位编程的新世纪
 
 
自从AMD于2003年9月23日发布了第一款基于x86架构的64位处理器,就意味着桌面世界将进入64位计算的新纪元。如今电脑市场上从低端的赛扬、闪龙到高端的P4、速龙,满眼都是64位的CPU,那么64位计算的时代果真到来了吗?
64位计算的全面普及,只有硬件还不够,还需要应用软件的支持,从操作系统到办公软件、从个人娱乐到游戏聊天,各个领域都需要64位软件的更新;而64位编程,从本质上来说,与现今的32位编程并没有太大不同,最大的不同之处在于,可直接寻址的空间增大了,如同当年16位到32位的转变一样。对开发普通程序来说,或许意义不大,但对大型复杂的科学或商业程序来说,无异于天边的一道曙光,君不见以往64位系统和软件只出现在大型服务器上,而现在64位的普及,意味着普通个人电脑也具有了以往大型机才可能有的计算能力,能以更低的价格完成以往昂贵的任务。本文将要介绍的,就是64位软件编程,让我们一起携手跨入64位编程的新世纪吧。
 
写过程序的人都知道,要进行编程,首先要有一个“编写”代码的环境,从理论上来说,记事本也可以完成编写代码的任务,但一个带有语法着色、智能感知输入的集成开发环境(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位编程做好了准备,你呢?
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
atk-1.25.2.tar.gz atk-1.26.0.tar.gz bigreqsproto-1.1.2.tar.bz2 cairo-1.8.6.tar.gz CPAN-1.94.tar.gz DirectFB-1.1.1.tar.gz expat-2.0.1.tar.gz expat-2.1.0.tar.gz ExtUtils-MakeMaker-6.20.tar.gz fontconfig-2.4.2.tar.gz fontconfig-2.6.0.tar.gz fontconfig-2.7.3.tar.gz freetype-2.3.5.tar.bz2 freetype-doc-2.3.6.tar.bz2 glib-2.12.1.tar.bz2 glib-2.14.4.tar.gz glib-2.18.2.tar.bz2 glibc-2.2.5.tar.bz2 gtk+-2.10.14.tar.bz2 gtk+-2.10.7.tar.bz2 gtk+-2.12.12.tar.bz2 inputproto-2.2.tar.bz2 jpegsrc.v6b.rar jpegsrc.v6b.tar.gz kbproto-1.0.6.tar.bz2 libpng-1.2.10.tar.bz2 libpng-1.2.32.tar.lzma libpthread-stubs_0.1.orig.tar.gz libsndfile-1.0.28.tar.gz libtool-1.5.22.tar.gz libtool-2.4.2.tar.xz libX11-1.0.3.tar.bz2 libX11-1.2.2.tar.bz2 libX11-1.3.2.tar.gz libX11-1.5.0.tar.bz2 libXau-1.0.7.tar.bz2 libXau-1.0.8.tar.bz2 libxcb-1.3.tar.bz2 libxcb-1.4.tar.bz2 libxcb-1.8.1.tar.bz2 libXdmcp-1.0.3.tar.gz libXdmcp-1.1.2.tar.bz2 libXext-1.0.1.tar.bz2 libXfont-1.4.4.tar.bz2 libXft-2.1.12.tar.bz2 libXft-2.1.13.tar.bz2 libxml2-2.6.30.tar.gz libxml2-2.6.32.tar.gz libxslt-1.1.29.tar.gz libXt-1.0.6.tar.bz2 pango-1.16.4.tar.bz2 pango-1.18.2.tar.gz pango-1.22.1.tar.bz2 pango-1.24.4.tar.bz2 pixman-0.24.0.tar.bz2 poky-pinky-3.1.1.tgz stubs-soft.h tiff-3.8.2.tar.gz tiff-4.0.7.tar.gz tslib-1.4.tar.gz xcb-proto-1.7.1.tar.bz2 xcmiscproto-1.1.2.tar.bz2 xcmiscproto-1.2.2.tar.bz2 xextproto-7.2.1.tar.bz2 xorg-server-1.3.0.0.tar.bz2 xorg-server-1.4.2.tar.bz2 xproto-7.0.23.tar.bz2 xtrans-1.2.7.tar.bz2 zlib-1.2.3.rar zlib-1.2.3.tar.gz zlib-1.2.5.tar.gz
\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib 的目录 2009-09-06 16:17 . 2009-09-06 16:17 .. 2006-03-03 23:19 13,712 Bits.Lib 2006-03-03 23:19 4,196 credui.lib 2006-03-03 23:19 57,730 daouuid.lib 2006-03-03 23:19 527,310 ddao35.lib 2006-03-03 23:19 531,012 ddao35d.lib 2006-03-03 23:19 528,038 ddao35u.lib 2006-03-03 23:19 532,702 ddao35ud.lib 2006-03-03 23:19 14,610 WinFax.Lib 2006-03-03 23:19 206,996 GdiPlus.lib 2006-03-03 23:20 27,500 HelpCenterInterfaces.tlb 2006-03-03 23:20 64,608 HelpServiceInterfaces.tlb 2006-03-03 23:21 13,252 p2p.lib 2006-03-03 23:21 11,218 p2pgraph.lib 2006-03-03 23:21 1,380,352 atlsd.pdb 2006-03-03 23:23 121,974 WiaGuid.Lib 2006-03-03 23:23 19,212 WiaScr.Tlb 2006-03-03 23:23 10,152 esebcli2.lib 2006-03-03 23:23 129,732 cdoex.tlb 2006-03-03 23:23 26,608 cdoexm.tlb 2006-03-03 23:23 10,832 exevtsnk.tlb 2006-03-03 23:23 7,888 ActiveDS.Lib 2006-03-03 23:23 99,122 ADSIid.Lib 2006-03-03 23:23 53,222 Wldap32.Lib 2006-03-03 23:23 55,600 CDOSys.Tlb 2006-03-03 23:23 6,254 certadm.lib 2006-03-03 23:23 217,676 certidl.lib 2006-03-03 23:23 59,044 Crypt32.Lib 2006-03-03 23:23 5,516 ComSvcs.Lib 2006-03-03 23:23 75,386 DtcHelp.Lib 2006-03-03 23:23 2,106 Mtx.Lib 2006-03-03 23:23 1,734 mtxdm.lib 2006-03-03 23:23 121,030 Svcguid.Lib 2006-03-03 23:23 63,400 xaSwitch.Lib 2006-03-03 23:23 3,364 xoleHlp.Lib 2006-03-03 23:23 6,402 Icm32.Lib 2006-03-03 23:23 1,978 Icmui.Lib 2006-03-03 23:23 17,036 Mscms.Lib 2006-03-03 23:23 620,890 MMC.Lib 2006-03-03 23:23

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值