乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 93|回复: 6

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

[复制链接]

117

主题

608

帖子

19

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1625
发表于 2013-7-13 11:27:00 | 显示全部楼层 |阅读模式
如果你打算升级你的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"
一般来说第一个链接应该就是:
(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;iBaseClasses properties->configuration->C/C++ ->Command Line,增加/wd4430选项。
  2. 或者在文件里面(一般来说是stdafx.h)添加 #pragma warning(disable: 4430)
  3. 4. 版本定义问题
  4. 在一些程序中,必须将
  5. [code]#ifndef WINVER                                         
  6. #define WINVER 0x0400                        
  7. #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 (ADS17)
        virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *mode) ;      
        virtual void subViewportDraw(AcGiViewportDraw * mode);
#else
        virtual Adesk::Boolean worldDraw(AcGiWorldDraw *mode) ;      
        virtual void viewportDraw(AcGiViewportDraw * mode);
#endif[/code]
R18及其以上版本用subWorldDraw代替了worldDraw,等等。
8.预编译头问题。
在一些旧的版本,CPP文件可能都按照默认设置为 Not using precompiled headers (不使用预编译头)
应当改成 Use(/YU),stdafx.cpp改成 Create(/YC)
这样一来可以极大地提高编译速度,二来减少一些升级时带来的问题。
待续。。。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

188

主题

1652

帖子

31

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2391
发表于 2013-7-13 21:42:00 | 显示全部楼层
这么高深,必定曲高和寡。我不懂,顶一顶。
回复

使用道具 举报

21

主题

149

帖子

11

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
231
发表于 2013-7-15 18:13:00 | 显示全部楼层
c++版本不通用,c#资源太少 杯具啊
回复

使用道具 举报

28

主题

248

帖子

20

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
349
发表于 2016-3-16 14:56:00 | 显示全部楼层
又长知识了!好贴!
回复

使用道具 举报

0

主题

11

帖子

5

银币

初来乍到

Rank: 1

铜币
11
发表于 2018-5-13 15:45:00 | 显示全部楼层
涨知识了,楼主好样的……
回复

使用道具 举报

0

主题

5

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2018-6-7 09:04:00 | 显示全部楼层
学习了,谢谢楼主的分享
回复

使用道具 举报

11

主题

23

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
67
发表于 2018-6-29 21:04:00 | 显示全部楼层
都是知识点,顶一个!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 10:52 , Processed in 0.216594 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表