zoukankan      html  css  js  c++  java
  • 软件移植:从win32到x64 .(转)

    随着软件对计算机主存的需求的扩张,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是开发中常用的工具,用于查看程

  • 相关阅读:
    集合——iterator迭代器
    集合——顶层collection接口(单列集合)
    集合——集合框架
    构造方法
    接口作为方法的参数或返回值——List接口
    接口作为成员变量——实现类和匿名内部类和匿名对象
    距离和相似度度量
    Kmeans算法与KNN算法的区别
    linux命令
    MapReduce初级案例
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/2919760.html
Copyright © 2011-2022 走看看