• arx升级


    arx升级

     


    如果你打算升级你的ARX或者想在同一个IDE(譬如vs2010)编译多个版本的ARX,那么我希望这篇帖子对你有帮助
    首先你应该简单了解Objectarx开发的版本对应情况:
    R15   --- 2000-2002  --- objectarx 2000,2002   --- vc6.0
    R16   --- 2004-2006   --- objectarx 2004-2006   --- vc7.0
    R17   --- 2007-2009  --- objectarx 2007-2009   --- vc8.0
    R18   --- 2010-2012  --- objectarx 2010-2012   --- vc9.0
    R19   --- 2013-2014(目前)  --- objectarx 2013,2014   --- vc10.0

    1.字符问题
    这个是最普遍的问题
    R17及其以上版本,必须以UNICODE编译。意味着绝大部分的字符串都应当以_T包围起来,譬如以前写的:

    普通浏览复制代码保存代码打印代码
    1. 转:ARX程序的升级及多版本编译须知acutPrintf ("hello");


    代码应当改写为:

    普通浏览复制代码保存代码打印代码
    1. 转:ARX程序的升级及多版本编译须知acutPrintf (_T("hello"));


    固然也可以写成

    普通浏览复制代码保存代码打印代码
    1. 转:ARX程序的升级及多版本编译须知acutPrintf (L"hello");


    不过这样在多重目标编译时候你不能向下兼容了。
    char 的类型需要改成TCHAR类型
    然后所对应的跟字符串有关的函数都需要做相对应的修改:
    譬如 strcpy 应当改为 _tcscpy ; strcmp要改为_tcscmp;或者相应的unicode函数。
    关于如何知道他们想对应的形式,可以用google搜索关键字:
    例如 "strcpy msdn"
    一般来说第一个链接应该就是:
    http://msdn.microsoft.com/zh-cn/library/kk6xf663(v=vs.80).aspx
    然后就可以得到相应的

    TCHAR.H     _tcscpy
    未定义      strcpy
    _MBCS       _mbscpy
    _UNICODE    wcscpy

    因而,你应当包含TCHAR.H
    不过一般情况下这个文件已经包含了。

    另外在vs2008或者vs2010上编译R16或者以下版本,可能要检查以下编译配置:
    C/C++->general-->use UNICODE Response files 这个地方可能要设置为No
    C/C++->Treat wchar_t as Built-in Type  这个地方要设置为NO
    Linker的General也是如此。

    2. for 循环问题

    由 vc6升级来的程序,如下for循环可以在vc6下成立:

    普通浏览复制代码保存代码打印代码
    1. 转:ARX程序的升级及多版本编译须知for (int i = 0;i< n;i++)
    2. 转:ARX程序的升级及多版本编译须知{...}
    3. 转:ARX程序的升级及多版本编译须知return i;



    但是对于其上版本,不成立,会出现编译错误:
    error C2065: 'i' : undeclared identifier
    for循环内定义的i一旦放在外面,则视作未定义符号。它的作用域仅仅在于循环内。

    因而有两种办法:
    第一种:修改代码,把 i定义到循环外面:

    普通浏览复制代码保存代码打印代码
    1. 转:ARX程序的升级及多版本编译须知int i;
    2. 转:ARX程序的升级及多版本编译须知for (i=0;i;i++)
    3. 转:ARX程序的升级及多版本编译须知...

    ...


    第二种:修改C/C++编译配置,把force confromance in for loop scope 修改为NO
    建议按第一种来,修改代码,使得符合C++  标准。(VC6只有不到80%的符合C++标准)

    3. 4430问题
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

    在VC6中,如果没有显示的指定返回值类型,编译器将其视为默认整型;但是vs2002及以上不支持默认整型. 这个错

    误,解决方法如下:
    打开project->BaseClasses properties->configuration->C/C++ ->Command Line,增加/wd4430选项。
    或者在文件里面(一般来说是stdafx.h)添加 #pragma warning(disable: 4430)

    4. 版本定义问题

    在一些程序中,必须将

    普通浏览复制代码保存代码打印代码
    1. 转:ARX程序的升级及多版本编译须知#ifndef WINVER                                         
    2. 转:ARX程序的升级及多版本编译须知#define WINVER 0x0400                         
    3. 转:ARX程序的升级及多版本编译须知#endif
    4. 转:ARX程序的升级及多版本编译须知 


    修改为

    普通浏览复制代码保存代码打印代码
    1. 转:ARX程序的升级及多版本编译须知#ifndef WINVER                                         
    2. 转:ARX程序的升级及多版本编译须知#define WINVER 0x0501                         
    3. 转:ARX程序的升级及多版本编译须知#endif


    因为有的版本的arx 最低版本为xp,意味着在windows 2000及其以下均不获支持。

    5. 模式定义(.def)文件和一些库文件
    在R2004的版本 上,基本不需要.def
    但如果为使得你的程序向下兼容,可以设置.def,并在附加依赖库上添加rxapi.lib
    另外,随着版本的升级,其中 objectarx的一些库文件也发生了变化。需用户自己检查。
    在高版本,基本可以不添加什么附加依赖项。

    6.如何让多重目标的编译自动适应各个版本:

    可以这样做:
    在project->BaseClasses properties->configuration->C/C++ ->;Preprocessor (预处理指令)
    中添加 ADS = 16 之类,16这里代表版本号R16。
    然后在代码中增加如下判断:
    #if (ADS<16)
    //R2004以下版本执行的代码
    #else
    //R2004以上版本执行的代码
    #endif

    7.一些虚函数的变化和升级
    譬如在自定义实体时可能碰到的错误:
    error C3248: 'AcGiDrawable::worldDraw': function declared as 'sealed' cannot be overridden by

    'XXX_Entity::worldDraw'

    你应当加如下判断:

    普通浏览复制代码保存代码打印代码
    1. 转:ARX程序的升级及多版本编译须知//ADS按照上面设置
    2. 转:ARX程序的升级及多版本编译须知#if(ADS>17)
    3. 转:ARX程序的升级及多版本编译须知        virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *mode) ;       
    4. 转:ARX程序的升级及多版本编译须知        virtual void subViewportDraw(AcGiViewportDraw * mode);
    5. 转:ARX程序的升级及多版本编译须知#else 
    6. 转:ARX程序的升级及多版本编译须知        virtual Adesk::Boolean worldDraw(AcGiWorldDraw *mode) ;      
    7. 转:ARX程序的升级及多版本编译须知        virtual void viewportDraw(AcGiViewportDraw * mode);
    8. 转:ARX程序的升级及多版本编译须知#endif



    R18及其以上版本用subWorldDraw代替了worldDraw,等等。

    8.预编译头问题。
    在一些旧的版本,CPP文件可能都按照默认设置为 Not using precompiled headers (不使用预编译头)
    应当改成 Use(/YU),stdafx.cpp改成 Create(/YC)
    这样一来可以极大地提高编译速度,二来减少一些升级时带来的问题。

  • 相关阅读:
    Windows Azure Web Site (19) Azure Web App链接到VSTS
    Windows Azure Virtual Machine (35) Azure VM通过Linked DB,执行SQL Job
    Azure PowerShell (16) 并行开关机Azure ARM VM
    Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
    Azure ARM (21) Azure订阅的两种管理模式
    Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户
    Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)
    Azure ARM (19) 将传统的ASM VM迁移到ARM VM (2)
    Azure ARM (18) 将传统的ASM VM迁移到ARM VM (1)
    Azure Automation (6) 执行Azure SQL Job
  • 原文地址:https://www.cnblogs.com/mjgw/p/12347777.html
Copyright © 2020-2023  润新知