`

学习ObjectArx编写时候遇到的各种问题汇总

阅读更多
学习objectarx遇到的种种问题

1.按照2007帮助中的每一步进行之后,在编译的时候出现

acutPrintf (_T("\nHello World!"));
出现这样的错误: '_T': identifier not found

在此页得到回答
http://www.objectarx.net/bbs/viewthread.php?tid=2168&extra=page%3D6
加这个头文件“TCHAR.h”

#include "TCHAR.h"

2. rxapi.lib(libinit.obj) : warning LNK4099: PDB 'rxapi.pdb' was not found with 'E:\ObjectARX2007\lib\rxapi.lib' or at 'g:\learnarx\hello\qj\debug\rxapi.pdb'; linking object as if no debug info

qj.exp : warning LNK4070: /OUT:qj.dll directive in .EXP differs from output filename 'G:\learnarx\hello\qj\Debug\qj.arx'; ignoring directive

查到此页
http://topic.csdn.net/u/20080412/14/8b3b0157-d3c1-4313-bc1d-6ca89840b240.html
和此页
http://www.mjtd.com/bbs/dispbbs.asp?boardID=14&ID=57411&page=1
说,按道理就是这样的,没有问题

3. 现在在加文字 的时候,编译出现了这个错误
错误 1 error C2664: 'AcDbText::AcDbText(const AcGePoint3d &,const ACHAR *,AcDbObjectId,double,double)' : cannot convert parameter 2 from 'const char *' to 'const ACHAR *' e:\c\objectarx\temp\temp\qjcreateent.cpp 87
后来查相关的objectARX的帮助,发现是这样的问题
AcDbText(
const AcGePoint3d& position,
const ACHAR* text,
AcDbObjectId style = AcDbObjectId::kNull,
double height = 0,
double rotation = 0);
而张帆书上的表达是 char* text
所以我修改了一下,不知道有没有用
没有用,结果要把字符串改成 (_T(“ddd”)); 才行

4. 错误
错误 1 fatal error LNK1104: 无法打开文件“rxapi.lib” temp
发现出现了这个错误

那就是lib没有引入了,要修改linker
rxapi.lib acdb17.lib acge17.lib acad.lib acedapi.lib  根据帮助文档的说法,要假如这几个lib

5. 错误
继续运行,发现有如下问题
错误 1 error C2653: 'CCreateEnt' : is not a class or namespace name e:\c\objectarx\temp\temp\acrxentrypoint.cpp 69
错误 2 error C3861: 'CreateLine': identifier not found e:\c\objectarx\temp\temp\acrxentrypoint.cpp 69
错误 3 error C2653: 'CCreateEnt' : is not a class or namespace name e:\c\objectarx\temp\temp\qjcreateent.cpp 12
这个说明刚才的打错了—qjCreateent而非 CcreateEnt(这个是张帆的例题的)

6. 错误
可以看到出现如下的错误
错误 1 fatal error C1083: Cannot open include file: 'arxHeaders.h': No such file or directory e:\c\objectarx\temp\temp\stdafx.h 95
那是因为没有加入inc路径
可以右键点击项目后,选到这个inc的选项后加入

7. 今天遇到的新的错误是
错误 1 error C2065: 'helloWorld' : undeclared identifier g:\work new pc\编程\c++\arx2011\arx2011\arx2011\helloworld.cpp 19
错误 2 error C2365: 'helloWorld' : redefinition; previous definition was 'formerly unknown identifier' g:\work new pc\编程\c++\arx2011\arx2011\arx2011\helloworld.cpp 34
错误 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int g:\work new pc\编程\c++\arx2011\arx2011\arx2011\helloworld.cpp 41

唉,总是好多错误
前两个错误是发现,忘记写这个代码了
void helloWorld();

然后,又出现了这个错误
错误 1 error C2664: 'AcEdCommandStack::addCommand' : cannot convert parameter 5 from 'void' to 'AcRxFunctionPtr' g:\work new pc\编程\c++\arx2011\arx2011\arx2011\helloworld.cpp 20

检查了一下,发现
// register a command with the AutoCAD command mechanism
acedRegCmds->addCommand(_T("HELLOWORLD_COMMANDS"),
_T("Hello"),
_T("Bonjour"),
ACRX_CMD_TRANSPARENT,
helloWorld());
这个最后一个的括号,要去掉,太多错误了,郁闷

ap appload
acrxGetApiVersion not found in R:\arx2011.arx
Make sure the app links with rxapi.lib and export the symbol.AcRxDynamicLinker
failed to load 'R:\arx2011.arx'
D:\Program Files\AutoCAD 2007\acad.exeUnable to load arx2011.arx file.
在CAD中加载后,出现这个问题,是没有写DEF吧

所以,最后的代码,就是这样了
#include "stdafx.h"
#include <aced.h>
#include <rxregsvc.h> 
#include <TCHAR.h>


void initApp();
void unloadApp(); 
void helloWorld();



void initApp()
{ 
	// register a command with the AutoCAD command mechanism
	acedRegCmds->addCommand(_T("HELLOWORLD_COMMANDS"),
		_T("Hello"),
		_T("Bonjour"),
		ACRX_CMD_TRANSPARENT,
		helloWorld);
}


void unloadApp()
{ 
	acedRegCmds->removeGroup(_T("HELLOWORLD_COMMANDS"));

}




void helloWorld()
{ 
	acutPrintf(_T("\nHello World!"));

}

extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{	switch (msg)
	{

	case AcRx::kInitAppMsg:
		acrxDynamicLinker->unlockApplication(pkt);
		acrxRegisterAppMDIAware(pkt);
		initApp();
		break;
	case AcRx::kUnloadAppMsg:
		unloadApp();
		break;
	default:
		break;

	}

	return AcRx::kRetOK;

}



def文件的就是这样
EXPORTS
acrxEntryPoint PRIVATE
acrxGetApiVersion PRIVATE


今天把这个项目就移到VS2010和CAD2012在X64下的平台

会遇到一些问题
需要做这三个方面的改进
1. inc目录
E:\ObjectARX 2012\inc-x64;E:\ObjectARX 2012\inc;%(AdditionalIncludeDirectories)

2.link
E:\ObjectARX 2012\lib-x64;%(AdditionalLibraryDirectories)

3. link的输入
rxapi.lib;acdb18.lib;acge18.lib;acad.lib;%(AdditionalDependencies)

4. 然后在右上角的配置管理器中
找到x64,加入


---------------------------------------------------
刚刚用VS2010及WIZARD来建立arx的方法
(1)用WIZARD建立,其中我加入了MFC支持,也不知道对不对
而后,我就ADD COMMAND,改成my1
那么,就去到
static void qjchArxLinemy1(void)
{
acutPrintf(_T("\nHello World!"));

// Add your code for command qjchArxLine.my1 here
}

这里加上这句话,然后就可以编译了,但是编译了不能通过,于是,就按照上面64位的操作弄了一遍,不过在编译过程中,经常出现LINK : fatal error LNK1000: Internal error during IncrBuildImage这个错误
于是google
http://hi.baidu.com/jialifuniya/blog/item/12a49dcf9d73c330f9dc6138.html
里面的方法2
第二种:修改链接选项,方法:项目->属性->链接器->常规   下面的“启用增量链接”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”,然后确定就可以了。
是有效的,很好,然后ARX就可以加载了

晚上,又把函数库写大了许多
又遇到了一个问题
AfxMessageBox("半径过小!");
error C2665: “AfxMessageBox”:  重载中没有一个可以转换所有参数类型

查找,得到
http://hi.baidu.com/ioypig/blog/item/aac79219060c2470dab4bdd1.html/cmtid/19ad31b5dc4addc137d3ca22

----------

4     if(AfxMessageBox("是否真的要退出当前程序?",MB_YESNO)==IDYES)
   5     AfxGetMainWnd()->SendMessage(WM_CLOSE);
   6    }

办法1: 将第4行改为:if(AfxMessageBox(_T("是否真的要退出当前程序?"),MB_YESNO)==IDYES)

办法2:选择“项目”菜单->项目属性->配置属性->常规->字符集,改为“未设置”即可。
---------

AfxMessageBox(_T("半径过小!"));

11. 好不容易在2008里面把许多程序调好了,结果放到2010里面来,全部一片红
第一个错误
using namespace System;
using namespace System::Threading;

//编译中出现

.\A.cpp(6) : error C2871: “System”: 具有该名称的命名空间不存在
.\A.cpp(7) : error C2653: “System”: 不是类或命名空间名称
.\A.cpp(7) : error C2871: “Threading”: 具有该名称的命名空间不存在

主要原因是 程序是托管代码,在项目设置中 选择

公共语言运行库支持(/clr)项 ,就好了!

12
错误 1 error D8016: “/clr”和“/Gm”命令行选项不兼容 F:\work new NOTE\c++\0 已经成功的ARX\Delaunay的绘制\arx2011\arx2011\cl arx2011

错误 1 error D8016: “/clr”和“/RTC1”命令行选项不兼容 F:\work new NOTE\c++\0 已经成功的ARX\Delaunay的绘制\arx2011\arx2011\cl arx2011

于是,在属性C++中的代码生成,找到 基本运行时检查,修改为 默认值

困惑了几天的问题
错误 3 error C2143: 语法错误 : 缺少“;”(在“<class-head>”的前面) f:\work new note\c++\0 已经成功的arx\arx2008选点画线\test2008\test2008\Qconvex.h 24 Test2008
错误 4 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int f:\work new note\c++\0 已经成功的arx\arx2008选点画线\test2008\test2008\Qconvex.h 24 Test2008


这个在C++里面一点问题都没有的,导入到arx的编程里面就整天出现这个代码
原因应该是 /CLR这个公共语言库的支持问题

后来,发现

static vector<Point> convex_hull(vector<Point> P);
修改为
static std::vector<Point> convex_hull(std::vector<Point> P);
就可以了,可能是托管代码与否的关系,真郁闷啊

然后
ref class Qconvex
修改为class Qconvex




分享到:
评论

相关推荐

    objectarx_wizards_2013+ObjectARX 2013Doc+解决问题.rar

    开发者在安装和使用ObjectARX向导时,可能会遇到各种问题,如安装失败、编译错误、运行时异常等。提供的解决方案可能涵盖了这些常见问题,帮助开发者迅速定位并修复问题,确保开发工作顺利进行。这些解决方案可能...

    objectARX编程基础_ObjectARX_objectarx编程_基础_

    ObjectARX支持事件驱动编程,开发者可以注册回调函数来响应AutoCAD的各种事件,如图形打开、关闭、用户输入等。这可以通过`acedRegApp()`函数中的`ArxAppRegInfo`结构体实现。 总的来说,ObjectARX编程涉及图形对象...

    ObjectARX2010 解决工具箱没有图标问题zh-chs.zip

    这是ObjectARX的中文资源包,要在VS中文版中使用ObjectARX,则需要改资源包。配置方法如下: 将压缩文件里的文件夹zh-csh拷贝到 C:\Program Files (x86)\Autodesk\ObjectARX Wizards for AutoCAD 2010\ArxAddInWiz ...

    ObjectARX学习资料大集合(2)

    首先,`ObjectARX.chm`可能是ObjectARX的官方帮助文档,包含了详细的API参考和教程,是学习ObjectARX开发的基础资料。这个文档会介绍如何创建ARX应用程序,如何注册新命令,以及如何与AutoCAD的数据模型交互。 `...

    ObjectArxSDK开发包_ObjectARX2002SDK_offerw78_objectarx依赖包_objectarx

    ObjectARX是Autodesk公司为AutoCAD开发的一款应用程序接口(API),它允许程序员使用C++等编程语言进行深度集成和定制化开发,以扩展AutoCAD...通过学习和实践,开发者可以利用ObjectARX来满足各种复杂的CAD应用场景。

    ObjectARXWizards-2018.zip

    ObjectARXWizards-2018.zip 是一个与CAD软件相关的开发工具包,主要针对AutoCAD平台。ObjectARX(Object ARX)是...同时,持续学习和深入研究ObjectARX API将有助于开发者创造出更加复杂和功能强大的定制化解决方案。

    ObjectARX 2008

    - **AutoCAD API**:学习和熟悉ObjectARX提供的各种API函数,理解它们的功能和使用方法。 - **事件驱动编程**:ObjectARX支持事件驱动编程模型,需要理解如何响应AutoCAD中的事件,如命令执行、图形修改等。 - **...

    ObjectARX2006 实例教程

    《ObjectARX 2006 实例教程》是一本专为学习和掌握AutoCAD的ObjectARX开发技术而编写的教程。ObjectARX是一种基于C++的开发环境,允许程序员深入到AutoCAD的内核,创建定制化的工程应用程序、自动化工具以及专业化的...

    ObjectARX开发实例教程

    ### ObjectARX开发实例教程知识点总结 #### 一、ObjectARX简介 - **定义**:ObjectARX是一种由Autodesk公司提供的高级API接口,它允许开发者创建与AutoCAD核心对象进行深度交互的定制应用程序。通过ObjectARX,...

    ObjectARX2012 zh-chs

    这是ObjectARX的中文资源包,要在VS中文版中使用ObjectARX,则需要改资源包。配置方法如下: 将压缩文件里的文件夹zh-csh拷贝到 C:\Program Files (x86)\Autodesk\ObjectARX Wizards for AutoCAD 2012\ArxAddInWiz ...

    objectArx自定义拖动类简单例子

    在AutoCAD环境中,ObjectARX(AutoCAD Runtime eXtension)是一种开发...如果你在实现过程中遇到问题,可以在相关论坛或社区留言,寻求帮助。不断实践和学习,你将能够熟练地使用ObjectARX创建出更多复杂的自定义功能。

    ObjectARX及MFC开发常见的问题及解决方法总结.doc

    在ObjectARX和MFC开发过程中,可能会遇到各种问题,这些问题通常涉及到编译错误、链接错误以及环境配置等问题。以下是一些常见问题及其解决方法: 1. **Microsoft Incremental Linker已停止工作**:这个问题表现为...

    ObjectARX中文版.chm;ObjectARX中文帮助文档.chm;ObjectARXLabs.chm 完整版

    我们有三个重要的资源:`ObjectARX中文版.chm`、`ObjectARX中文帮助文档.chm`以及`ObjectARXLabs.chm`,它们分别提供了关于ObjectARX的中文教程、帮助文档和实验示例,对于学习和开发基于ObjectARX的应用程序至关...

    ObjectArx.rar_ObjectARX_ObjectARX教程_objectarx 张帆_objectarx com

    Objectarx大观园张帆的作品 Objectarx的开发教程

    objectarx国外教材.

    ### ObjectARX 国外教材知识点详解 #### 一、ObjectARX 概览 **ObjectARX** 是 AutoCAD 的一种运行时扩展技术,它...掌握了基本概念和技能后,学习者将能够进一步探索 ObjectARX 的潜力,创建出更加复杂的解决方案。

    ObjectARX学习资料大集合(1)

    通过深入学习和实践,开发者可以逐步精通ObjectARX,从而在AutoCAD平台上构建出功能强大、个性化的应用程序,满足各种专业需求。对于那些热衷于CAD技术的工程师和程序员来说,ObjectARX是一把开启无限可能性的钥匙。

    ObjectARX 2016官方文档

    《ObjectARX 2016官方文档》是AutoCAD 2016软件的开发指南,主要针对希望使用C++或.NET进行AutoCAD插件开发的程序员。ObjectARX是一个由Autodesk提供的开发框架,它允许开发者创建能够直接与AutoCAD内部数据交互的...

    ObjectARX中文版.chm

    3. **事件处理**:ObjectARX支持事件驱动编程,可以监听和响应AutoCAD中的各种事件,如命令执行、图层改变等,实现自动化响应。 4. **对象模型**:ObjectARX提供了丰富的对象模型,允许开发者创建、修改和管理Auto...

    Objectarx Addin 中文包

    由于ObjectARX涉及到的许多API和资源文件是英文的,中文用户在开发过程中可能会遇到界面不匹配或者理解困难的问题。"ObjectARX Add-in 中文包"解决了这个问题,使得在VS中创建、调试和管理ObjectARX插件更为直观和...

    AutoCAD 2000 ObjectARX编程指南

    通过学习《AutoCAD 2000 ObjectARX编程指南》,开发者不仅能掌握ObjectARX的基本技能,还能深入理解AutoCAD的内部工作原理,从而更高效地开发出满足各种需求的定制化解决方案。由于这本书比较早,一些内容可能已经...

Global site tag (gtag.js) - Google Analytics