如果你打算升级你的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. acutPrintf ("hello");

代码应当改写为:

普通浏览复制代码保存代码打印代码
  1. acutPrintf (_T("hello"));

固然也可以写成

普通浏览复制代码保存代码打印代码
  1. 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. for (int i = 0;i< n;i++)
  2. {...}
  3. return i;

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

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

普通浏览复制代码保存代码打印代码
  1. int i;
  2. for (i=0;i;i++)
  3. ...

...

第二种:修改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. #ifndef WINVER
  2. #define WINVER 0x0400
  3. #endif

修改为

普通浏览复制代码保存代码打印代码
  1. #ifndef WINVER
  2. #define WINVER 0x0501
  3. #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. //ADS按照上面设置
  2. #if(ADS>17)
  3.         virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *mode) ;
  4.         virtual void subViewportDraw(AcGiViewportDraw * mode);
  5. #else
  6.         virtual Adesk::Boolean worldDraw(AcGiWorldDraw *mode) ;
  7.         virtual void viewportDraw(AcGiViewportDraw * mode);
  8. #endif

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

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

arx升级的更多相关文章

  1. 用vs2010编译和调试多个arx版本的arx项目

    翻译自dev guide<Compile and Debug Mixed-mode projects>    默认vs2010是使用ARX2014,开发AutoCAD2014使用的ARX, ...

  2. arx移植 及预处理器

    来源:http://bbs.mjtd.com/thread-102486-1-1.html 另,ObjectARX编程参考:http://bbs.mjtd.com/forum-14-1.html 如果 ...

  3. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  4. 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!

    看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...

  5. Entity Framework Core 1.1 升级通告

    原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...

  6. ASP.NET 5 RC1 升级 ASP.NET Core 1.0 RC2 记录

    升级文档: Migrating from DNX to .NET Core Migrating from ASP.NET 5 RC1 to ASP.NET Core 1.0 RC2 Migrating ...

  7. SQL Server2016升级前几点自检

    SQL Server2016已经出来一段时间了,而且最新的SP1包也于2016年11月18日正式发布,各种新的特性推出让我们跃跃欲试.那么对于我们真实的业务环境,特别是生产环境要不要"跟风& ...

  8. 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版

    背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...

  9. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...

随机推荐

  1. codeforces 552 C Vanya and Scales

    这个题的意思就是给出一个数m.以及一个以1为首元素.w为比例常数的等比数列,数列长度为101,数列中每一个数字最多仅仅能用一次.问是否存在xa+wb+--=wc+wd+--+we+m. 非常显然,换句 ...

  2. [英语学习]微软面试前英语集训笔记-day 1

    最近有机会参加微软面试前的英语集训. 第一天是由wendy老师主讲.热场题目是介绍你自己.包括你的姓名,家庭hobby,爱好,专业,学校,工作经历等等. 接下来的主题是friendship.给我印象较 ...

  3. 危险的kill

    . ps -aux | grep -E "chk.*url.*py" | cut -c 10-15 | xargs kill -9 ps -x | grep -E "ch ...

  4. bzoj 1370 Gang团伙

    题目大意: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,满足 1. 我朋友的朋友是我的朋友 2. 我敌人的敌人是我的朋友 所有是朋友的人组成一个团伙 告诉你关于这n个人的m条信息,即某两个 ...

  5. Gamma的完全理解

    Gamma校正 问题:什么是Gamma曲线矫正?Gamma曲线矫正是什么意思?       Gamma曲线是一种特殊的色调曲线,当Gamma值等于1的时候,曲线为与坐标轴成45°的直线,这个时候表示输 ...

  6. 配置URL

  7. Permutations II 典型去重

    https://leetcode.com/problems/permutations-ii/ Given a collection of numbers that might contain dupl ...

  8. NestedPreb

    屌丝手动版 One of the things we’re sorely missing from Unity is nested prefabs. So we rolled this little ...

  9. P2252 取石子游戏

    传送门 威佐夫博弈结论:若石子数为\(a,b(a<b)\),当且仅当\((y-x)*\frac{(\sqrt{5}+1)}{2}=x\)的时候先手必败 证明 //minamoto #includ ...

  10. C# 树次结构的数据

    public static void CreateTree(TreeView tv) { ///获取层次结构的数据 Tree tree = new Tree(); DataSet ds = tree. ...