slyrabbit 发表于 2009-8-20 15:31:00

刚学ObjectARX2006实例教程 就遇到个问题

<p>刚学就遇到个编译的问题,我的系统式vc.NET2003,按照例子操作,编译时提示无法解析的外部符号,请高手帮忙解决。新人遇到问题不知道如何分析,请高人不吝赐教。</p><p>错误提示如下:</p><p>Step01 error LNK2019: 无法解析的外部符号 "public: static class AcRxClass * __cdecl AcEdCommandStack::desc(void)" (<a href="mailto:?desc@AcEdCommandStack@@SAPAVAcRxClass@@XZ">?desc@AcEdCommandStack@@SAPAVAcRxClass@@XZ</a>) ,该符号在函数 "public: static class AcEdCommandStack * __cdecl AcEdCommandStack::cast(class AcRxObject const *)" (<a href="mailto:?cast@AcEdCommandStack@@SAPAV1@PBVAcRxObject@@@Z">?cast@AcEdCommandStack@@SAPAV1@PBVAcRxObject@@@Z</a>) 中被引用</p><p>原代码如下:(程序打包上传到附件,方便大家帮我解决问题时调试)</p><p>#include "stdafx.h"<br/>#include &lt;aced.h&gt; <br/>#include &lt;rxregsvc.h&gt; </p><p>void initApp(); <br/>void unloadApp();<br/>void helloWorld();</p><p>void initApp() <br/>{ <br/>&nbsp;&nbsp;&nbsp; // register a command with the AutoCAD command mechanism <br/>&nbsp;&nbsp;&nbsp; acedRegCmds-&gt;addCommand("HELLOWORLD_COMMANDS", <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Hello", <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bonjour", <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACRX_CMD_TRANSPARENT, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; helloWorld); <br/>} </p><p>void unloadApp() <br/>{ <br/>&nbsp;acedRegCmds-&gt;removeGroup("HELLOWORLD_COMMANDS"); <br/>}</p><p>void helloWorld() <br/>{ <br/>&nbsp;acutPrintf("\nHello World!"); //实现本程序的具体功能<br/>} </p><p>extern "C" AcRx::AppRetCode <br/>acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) <br/>{ <br/>&nbsp;&nbsp;&nbsp; switch (msg) <br/>&nbsp;&nbsp;&nbsp; { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case AcRx::kInitAppMsg: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acrxDynamicLinker-&gt;unlockApplication(pkt); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acrxRegisterAppMDIAware(pkt); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initApp(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case AcRx::kUnloadAppMsg: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unloadApp(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br/>&nbsp;&nbsp;&nbsp; } <br/>&nbsp;&nbsp;&nbsp; return AcRx::kRetOK; <br/>}<br/><br/></p>

wj_job 发表于 2009-8-21 03:30:00

把#include "arxHeaders.h"头文件加进去。<br/>#include &lt;aced.h&gt; <br/>#include &lt;rxregsvc.h&gt; <br/>这两个去掉!<br/>

slyrabbit 发表于 2009-8-21 08:57:00

<p>谢谢您的解答,我按照您的方法,把#include "arxHeaders.h"头文件加进去,编译得到很多其他提示,提示都是说C:\Program Files\Autodesk\ObjectARX 2006\inc文件夹下的很多文件中有问题,是不是我的ObjectARX 2006有问题啊?</p>

wj_job 发表于 2009-8-21 10:08:00

难说,我编译可以通过的。

wj_job 发表于 2009-8-21 10:11:00

忘了问了,你除了包含头文件以外,不知道库文件(.lib文件)有没有添加?

slyrabbit 发表于 2009-8-21 11:55:00

<p>您说的添加lib是在属性页中加吗?我刚开始学习arx,还没入门,很多东西不清楚,您能加我qq吗?67086887,我拜你为师^_^,我是按下面的教程做的,请你给指点下什么地方有问题。</p><p>1.1 创建一个ObjectARX 项目<br/>运行Visual C++ .NET,然后逐步创建第一个ObjectARX 应用:<br/>1.从Visual C++ .NET 的菜单,选择[文件] &gt;[新建]&gt;[项目…]&gt;&gt;;<br/>2.键入新项目的存放路径和项目名称,如“d:”,“Step01”;(图1.1.2)<br/>3.单击[完成],弹出对话框;<br/>4.选择[应用程序设置]属性页,在“应用程序类型:”中选择 "DLL";(图1.1.4)<br/>5.单击[完成],即完成了一个新项目的创建。<br/>1.2 设置编译器<br/>1.从Visual C++ .NET 的菜单,选择[视图]&gt;[属性页],弹出“属性页”对话框;<br/>2.在[配置]下拉列表中,选择“所有配置”;(图1.2)<br/>3.选择节点,进行如下设置:<br/>[常规]/[附加包含目录]设置为:C:\Program Files\Autodesk\ObjectARX2006\inc<br/>[常规]/[警告等级]设置为:1 级 (/W1)<br/>[常规]/[检测64 位可移植性问题]设置为:否<br/>[代码生成]/[运行时库]设置为:多线程 DLL (/MD)<br/>4.单击[应用],完成编译器的设置。<br/>1.3 设置链接器<br/>1.选择[链接器]节点,进行如下设置:<br/>[常规]/[输出文件]设置为:$(OutDir)/Step01.arx<br/>[常规]/[附加库目录]设置为:C:\Program Files\Autodesk\ObjectARX2006\lib<br/>[ 输入]/[ 附加依赖项] 设置为: rxapi.lib acdb16.lib acge16.lib acad.lib<br/>acedapi.lib<br/>2.单击[完成],完成链接器的设置。<br/>1.4 添加代码<br/>1.4.1 创建一个新的cpp 文件<br/>(1)从Visual C++ .NET 的菜单,选择[项目] &gt;[添加新项],弹出“添加新项”对话框;<br/>(2)在[添加新项]下拉列表中,选择“C++ 文件 (.cpp)”;<br/>(3)键入存放路径“d:\Step01\”和文件名“HelloWorld”;<br/>(4)单击[打开],创建了一个空的cpp 文件。<br/>1.4.2 添加代码<br/>在HelloWorld.cpp 窗口,添加如下代码:<br/>#include "stdafx.h"<br/>#include &lt;aced.h&gt;<br/>#include &lt;rxregsvc.h&gt;<br/>void initApp();<br/>void unloadApp();<br/>void helloWorld();<br/>void initApp()<br/>{<br/>// register a command with the AutoCAD command mechanism<br/>acedRegCmds-&gt;addCommand("HELLOWORLD_COMMANDS",<br/>"Hello",<br/>"Bonjour",<br/>ACRX_CMD_TRANSPARENT,<br/>helloWorld);<br/>}<br/>void unloadApp()<br/>{<br/>acedRegCmds-&gt;removeGroup("HELLOWORLD_COMMANDS");<br/>}<br/>void helloWorld()<br/>{<br/>acutPrintf("\nHello World!"); //实现本程序的具体功能<br/>}<br/>extern "C" AcRx::AppRetCode<br/>acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)<br/>{<br/>switch (msg)<br/>{<br/>case AcRx::kInitAppMsg:<br/>acrxDynamicLinker-&gt;unlockApplication(pkt);<br/>acrxRegisterAppMDIAware(pkt);<br/>initApp();<br/>break;<br/>case AcRx::kUnloadAppMsg:<br/>unloadApp();<br/>break;<br/>default:<br/>break;<br/>}<br/>return AcRx::kRetOK;<br/>}<br/>为了使AutoCAD 能访问acrxEntryPoint()函数,还需要创建一个def 文件。<br/>1.5 创建DEF 文件<br/>1.5.1 创建一个新的def 文件<br/>(1)从Visual C++ .NET 的菜单,选择[项目] &gt;[添加新项],弹出“添加新项”对话框;<br/>(2)在[添加新项]下拉列表中,选择“def 文件 (.def)”;<br/>(3)键入存放路径“d:\Step01\”和文件名“ArxProject”;<br/>(4)单击[打开],创建了一个def 文件。<br/>1.5.2 添加代码<br/>在ArxProject.def 窗口,已经有了一行代码<br/>LIBRARY Step01<br/>再添加如下代码:<br/>EXPORTS<br/>acrxEntryPoint PRIVATE<br/>acrxGetApiVersion PRIVATE<br/>1.6 编译和运行Step01<br/>编译Step01 项目,应该不会有什么问题,生成Step01.arx。<br/>运行Acad2006,加载Step01.arx。<br/>在命令行键入“hello”。<br/>则在命令行上打印输出:“Hello World!”。</p>

wj_job 发表于 2009-8-21 12:27:00

你先用ArxWizards向导做开发吧,初学时不好自己配置环境。向导安装包在utils/ObjARXWiz里头。我平时不在线,所以加QQ不方便,用邮箱吧。opensourcewj@gmail.com.

slyrabbit 发表于 2009-8-21 12:39:00

您是说安装这个吧?&lt;ObjectARX SDK 文件夹&gt;\utils\ObjARXWiz\ ArxWizards.msi,我已经安装了

lylyliu 发表于 2009-8-27 23:40:00

看看警告等级和运行时库是否对 应该是多线程MD
页: [1]
查看完整版本: 刚学ObjectARX2006实例教程 就遇到个问题