搜索文章:

首页  |  Java技术  |  Asp.net  |  Asp编程  |  VC/C++  |  Delphi  |  VB编程
上一篇:>>>详细内容 >>

>>>详细内容

  写过程序的人都知道,要进行编程,首先要有一个"编写"代码的环境,从理论上来说,记事本也可以完成编写代码的任务,但一个带有语法着色、智能感知输入的集成开发环境(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位编程做好了准备,你呢?
下一篇:>>>详细内容 >>
相关文章:
© 2006   www.java-asp.net