转:ARX程序的升级及多版本编译须知

(2013-11-27 19:25:15)

转载▼
标签:

arx

版本升级

虚函数重载

 
来源:http://bbs.mjtd.com/thread-102486-1-1.html

另,ObjectARX编程参考:http://bbs.mjtd.com/forum-14-1.html
如果你打算升级你的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. 微信小程序升级Vant Weapp版本

    微信小程序升级Vant Weapp版本 大家好,今天我们来学习一下微信小程序如何升级Vant Weapp版本,好好看,好好学,超详细的 第一步 首先你要有一个构建npm的项目 还不知道构建npm的小伙 ...

  2. linux sudo 版本,Linu下如何升级当前sudo版本

    Sudo 的全称是"superuserdo",它是Linux系统管理指令,允许用户在不需要切换环境的前提下以其它用户的权限运行应用程序或命令,通常是以 root 用户身份运行命令, ...

  3. U-LINK2 升级后低版本不识别问题

    U-LINK2 升级后低版本不识别问题 背景 我在keil5上使用ULINK2仿真器时,第一次使用提示升级ULINK2固件,我就点击了确定. 结果我的ULIN2就成了奇葩,在其他同事的机器上(KEIL ...

  4. CC2540 Large OAD实现程序无线升级

    CC254x代码量小于128K的可以使用ImageA和ImageB互切的方案,这个是TI比较标准的方案,但是有两个缺点:一是代码量限制的太小了,仅例程编译下来都要110K了,给用户可以扩展的空间太小: ...

  5. 在64位CAD上配置合适的ARX程序

    昨天遇到了一个问题,我在公司的电脑是32位操作系统,安装的32位CAD2010.在公司跑ARX win32程序没有问题,但是我在自己的本本上下载了64位的CAD2010,然后再用VS2008同样的编译 ...

  6. WinCE 应用程序开机自启动方法( 修正版本)

    WinCE 应用程序开机自启动方法( 修正版本) 分类: wince 2011-04-06 19:20 50人阅读 评论(0) 收藏 举报 近日在开发过程中遇到WinCE应用程序开机自动运行的问题,在 ...

  7. python如何升级到指定版本_python如何升级?

    如何升级到python3版本并且安装pip3准备: Python-3.5.2.tar.xz pip-8.1.2.tar.gz setuptools-24.0.2.zip 接下来跟着我一起升级安装吧~~ ...

  8. Linux查sudo版本,Linu下如何升级当前sudo版本

    Linu下如何升级当前sudo版本 Sudo 的全称是"superuserdo",它是Linux系统管理指令,允许用户在不需要切换环境的前提下以其它用户的权限运行应用程序或命令,通 ...

  9. java 对比两个表的字段的差异_Joolun小程序商城 2.2.2版本上线了——Java微信快速开发平台...

    Joolun是一款基于spring-boot的微信快速开发平台,目前拥有公众号基础版和小程序商城版两个版本.Joolun采用目前流行的前后端分离技术所写,是一款高效.易用的java微信开发框架平台,二 ...

最新文章

  1. 分布式id 实现方式
  2. 怎样学习linux系统管理员,linux系统管理员学习笔记
  3. 模块隐藏(LDR_MODULE链 与 PE特征)
  4. Java的容器的线程安全
  5. 《移动优先与响应式Web设计》一1.2 设备不同,功能不同
  6. Linux查看Bios信息
  7. 【机器学习】监督学习--(回归)多元线性回归
  8. Python+OpenCV:Optical Flow(光流)
  9. Java练习 SDUT-1294_选票统计
  10. 计算机网络(第 8 版)第 1 章概述 谢希仁 编著
  11. stm32_霍尔编码器
  12. iserdese2接口详解_-02-Xilinx的SerDes接口介绍【Xilinx-LVDS读写功能实现】
  13. php获取qq头像和昵称,通过接口获取QQ头像和昵称
  14. 一键彻底关闭WIN10自动更新_BlockWin10AU
  15. 2020-11-28画图上的最大值点,和零基准线
  16. mysql时间戳与PHP时间戳,php – 当mysql时间戳gt; 20分钟时删除时间戳比较
  17. FLASH多文件上传组件
  18. 血拼2011中国移动开发者大会门票超低价团购!(已结束)
  19. android 换肤功能
  20. STC15W408AS-35I-DIP28引脚功能图

热门文章

  1. <pre>标签有什么用
  2. mysql时间差计算
  3. android SQL数据库
  4. 大数据004——Hadoop
  5. Tomcat 发布部署jsp网站—-使用自己的ip访问jsp网站
  6. vscode 插件开发
  7. (8)多表查询【Oracle】
  8. linux内核sscanf,linux sscanf_s
  9. 华为matebook13笔记本 右侧type-c接口 没反应,失灵 ,失效,不通电,无法识别usb设备,设备管理器Unknown usb device
  10. specify的含义、作用及vcs对应仿真选项