rainbowzc

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

随着软件对计算机主存的需求的扩张,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编译器即可,如下图:

image

image

 

2. 配置x64编译选项

2.1 增加x64目标平台

打开需要移植的项目,在解决方案管理器中,项目节点单击右键选择属性,打开项目属性对话框,并打开配置管理器,如下图:

image

在“活动解决方案平台”下拉列表中选择新建,打开“新建解决方案平台”对话框:

image 在新的平台中选择x64,并从现有win32平台复制且创建新的项目平台,单击确定,即完成平台的创建。

2.2 配置x64编译属性

在上述新建立的平台配置中,为了简化配置工作,我们是从现有Win32平台配置拷贝而来,所以在建立完成后,我们仍需要对新建的编译配置做部分修改,在创建新的目标平台前,软件有两个编译配置debug和release,均为win32平台的编译配置;在建立新的平台后,就会组合出新的编译配置,即针对x64的debug和release版本,如下图:clip_image002

所以修改x64编译属性时,就需要同时修改对应的debug和release配置了(如果之前还有其他编译配置,此处也要对应修改),下面以Debug|x64为例说明配置的修改:

预处理器:将宏WIN32改为_WIN64,如下图:

image

第三方库目录指向x64版本库目录,当软件使用了vs库以外的第三方库时,需要相应的库的x64版本,包括导入库(动态链接时):

image在处理器构架选项中,系统会自动设置为x64,如下图:

image

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版本:

image

上图中,可以看到同时运行了两个扫雷程序,其中一个是win32版本,另一个是x64版本,可以看到,任务管理器通过进程名对二者加以区分,凡是32位程序,其进程名后都以“*32”标记,而x64程序的进程名则正常。

5.2 Dependency Walker

Dependency Walker是开发中常用的工具,用于查看程

posted on 2013-02-20 22:21  ct  阅读(6636)  评论(0编辑  收藏  举报