明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1937|回复: 8

紧急呼叫:为什么会这样,那样不太麻烦!!

[复制链接]
发表于 2005-3-10 11:36:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2005-3-10 12:06:33 编辑

老是在.def那边出错 是不是环境设置问题呀 --------------------Configuration: Entities - Win32 Debug--------------------
Linking...
Entities.def : error LNK2001: unresolved external symbol acrxGetApiVersion
Debug/Entities.lib : fatal error LNK1120: 1 unresolved externals
LINK : fatal error LNK1141: failure during build of exports file
Error executing link.exe. Entities.dll - 3 error(s), 0 warning(s) 是不是所有的 ARX编程都要进行这样类似的设置 (1) 选择菜单命令【Project】→【Settings…】,弹出“Project Settings”对话框。 (2) 在“Project Settings”对话框中选择“Setting For:”下拉列表的“All Configurations”项。
(3) 在“Project Settings”对话框中选择“C/C++”选项卡。
(4) 在“Category:”下拉列表中选择“Code Generation”项。然后选中“Use run-time library”下拉列表中的“Multithreaded DLL”选项(如图38-6所示)。再在“Category:”下拉列表框中选择“Preprocessor”项,然后在“Preprocessor definitions:”编辑框中内容的后面添加“ACRXAPP,RADPACK”,表示需要预链接的库(如图38-7所示)。
(5) 在“Project Settings”对话框中选择“Link”选项卡。
(6) 在“Category:”下拉列表中选择“General”项,然后在“Output file name:”编辑框中键入应用程序名“.\HelloARX.arx”(图38-8);在“Object/library modules:”编辑框中添加“acutil15.lib acrx15.lib acdb15.lib acedapi.lib rxapi.lib acad.lib acge15.lib”;在“Category:”下拉列表框中选择“Output”项,然后在“Base address:”编辑框中键入“0x1c000000”(图38-9)。
发表于 2005-3-10 11:57:00 | 显示全部楼层
???????????????


不明白你的意思


不需要设置什么呀!
 楼主| 发表于 2005-3-10 12:04:00 | 显示全部楼层
那为什么很多初级教程都要做这一步设置


tool。。。。


project。。。。
发表于 2005-3-10 14:16:00 | 显示全部楼层

如果没有ARX Wizard, 环境设置就是要做的

这个export function是你在Link中添加的那么一大堆东西中间那个rxapi.lib负责的.


那些初级教程所做的是在ObjectARX还没有Wizard时候的事, 现在应该是2000及以上都有Wizard可用, 所以什么都不用设置, Wizard会自动生成.


如果你有ObjectARX Wizard就用(ARX的文件夹里有一个utils文件夹, wizard的安装文件在里头), 如果没有..好象就只有每次重新设置过了..


其实最需要的设置只有Link下面那些library module和output filename, 用一个notepad抄下来每次copy & paste..其他的MFC DLL Wizard已经做好的, output base address好象也不完全必须..
 楼主| 发表于 2005-3-11 10:55:00 | 显示全部楼层
//Entities.cpp
//AutoCAD数据库初级操作实例——创建实钵、层、新组词典等,
//在AutoCAD命令行中运行MakeNewEnts即可
//包含头文件
#include <string.h>
#include <aced.h>
#include <dbents.h>
#include <dbsymtb.h>
#include <dbgroup.h>
#include <dbapserv.h> //函数声明
AcDbObjectId createNewLine();
AcDbObjectId createNewCircle();
AcDbObjectId createNewLayer();
void createNewGroup();
Acad::ErrorStatus changeColor(AcDbObjectId,Adesk::UInt16); //创建直线对象,并返回对象ID
AcDbObjectId CreateNewLine()
{
//定义直线的起点、终点
AcGePoint3d startPoint(5.0,4.0,0.0);
AcGePoint3d endPoint(15.0,10.0,0.0);
//初始化直线对象实例
AcDbLine* pLine=new AcDbLine(startPoint,endPoint);
//打开块表
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,AcDb::kForRead);
//打开模型空间块表段,获得当前块表记录,并关闭块表
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
pBlockTable->close();
//向当前块表记录中添加直线对象
AcDbObjectId lineId;
pBlockTableRecord->appendAcDbEntity(lineId,pLine);
//关闭块表记录及直线对象
pBlockTableRecord->close();
pLine->close();
//返回直线对象ID
return lineId;
}
//创建圆对象,并返回对象ID
AcDbObjectId CreateNewCircle()
{
//定义圆心、法向向量
AcGePoint3d center(10.0,7.0,0.0);
AcGeVector3d normal(0.0,0.0,1.0);
//初始化圆对象实例
AcDbCircle *pCirc=new AcDbCircle(center,normal,4.5);
//打开块表
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,AcDb::kForRead);
//打开模型空间块表,获得当前块表记录,并关闭块表
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
pBlockTable->close();
//向当前块表记录中添加圆对象
AcDbObjectId CircleId;
pBlockTableRecord->appendAcDbEntity(CircleId,pCirc);
//关闭块表记录及圆对象
pBlockTableRecord->close();
pCirc->close();
//返回圆对象ID
return CircleId;
} //建立名为“MYNewLayer”的新层
AcDbObjectId createNewLayer()
{
//打开层表,打开方式为只写
AcDbLayerTable *pLayerTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTable,AcDb::kForWrite);
//初始化层表记录对象,并设定层表记录的名称“MYNewLayer”
AcDbLayerTableRecord *pLayerTableRecord=new AcDbLayerTableRecord;
//层的其它属性(例如颜色、线形等)都用缺省但,
//如:颜色为white、线形为Continuous等
//将新建的层表记录添加到层表中,并将层表记录的ID
//保存到PLayerId作为函数的返回值
AcDbObjectId pLayerId;
pLayerTable->add(pLayerId,pLayerTableRecord);
//关闭层表和层表记录对象
pLayerTable->close();
pLayerTableRecord->close();
return pLayerId;
} //建立新组词典条目,利用第三个参数可以改变组的层属性
void createNewGroup(AcDbObjectIdArray& objIds,char* pGroupName,AcDbObjectId pLayerId)
{
//初始化组对象实例,以参数pGroupName为组名
AcDbGroup *pGroup= new AcDbGroup(pGroupName);
//向组对象中加入实体
for(int i=0;i<objIds.length();i++)
pGroup->append(objIds);
//打开组词典(存放于对象词典中)
AcDbDictionary* pGroupDict;
acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict,AcDb::kForWrite);
//将新建的组词典条的R入到组词典中
AcDbObjectId pGroupId;
pGroupDict->setAt(pGroupName,pGroup,pGroupId);
//将组pGroup的层属性修改为PLayerld所代表的层
pGroup->setLayer(pLayerId);
//关闭组词典和组词典对象
pGroupDict->close();
pGroup->close();
}
//修改实体对象颜色,并返回一个状态码
Acad::ErrorStatus
changeColor(AcDbObjectId endId,Adesk::UInt16 newColor)
{
//定义一个实体对象,并利用参数endId打开这个实体对象
AcDbEntity *pEntity;
acdbOpenObject(pEntity,endId,AcDb::kForWrite);
//修改实体对象的颜色
pEntity->setColorIndex(newColor);
//关闭实体对象
pEntity->close();
//返回Acad::eOK,对于有容错处理的程序,可能在函数当中就返回另外的状态码
return Acad::eOk;
} //命令MakeNewEnts的执行函数
void runIt()
{
//创建新层
AcDbObjectId newLayerId=createNewLayer();
//定义一个对象Id序列idArray
AcDbObjectIdArray idArray;
//创建一条直线和一个圆
//将新建的直线、圆对象加入idArray中
idArray.append(createNewLine());
idArray.append(createNewCircle());
//由于新建的两个对象均在0层,他们的缺省颜色为ByLayer
//将直线对象的颜色该为红色(1)
//将圆对象的颜色该为绿色(3)
changeColor(idArray.first(),1);
changeColor(idArray.last(),3);
//将直线和圆对象放到组“MyNewGroup”中,
//并将组的层属性改为“MyewGroup”层,
//组中的两个实体对象的层属性也相应的改为“MyNewGroup”层
//创建新层的函数也可以写成带名称参数
createNewGroup(idArray,"MyNewGroup",newLayerId);
} //初始化函数
void initApp()
{
acedRegCmds->addCommand("ASDK_MAKE_ENTITIES",
"ASDK_MakeNewEnts","MakeNewEnts",ACRX_CMD_MODAL,runIt);
} //卸载函数
void unloadApp()
{
acedRegCmds->removeGroup("ASDK_MAKE_ENTITIES");
} //应用程序主函数
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
switch (msg)
{
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
//调用initApp()函数
initApp();
break;
case AcRx::kUnloadAppMsg:
//调用unloadApp()函数
unloadApp();
break;
}
return AcRx::kRetOK;
}
 楼主| 发表于 2005-3-11 10:56:00 | 显示全部楼层
--------------------Configuration: EntitiesARX - Win32 Debug--------------------
Compiling...
Entities.cpp
Linking...
Creating library Debug/Entities.lib and object Debug/Entities.exp
Entities.obj : error LNK2001: unresolved external symbol "class AcDbObjectId __cdecl createNewCircle(void)" (?createNewCircle@@YA?AVAcDbObjectId@@XZ)
Entities.obj : error LNK2001: unresolved external symbol "class AcDbObjectId __cdecl createNewLine(void)" (?createNewLine@@YA?AVAcDbObjectId@@XZ)
.\Entities.arx : fatal error LNK1120: 2 unresolved externals
Error executing link.exe. Entities.arx - 3 error(s), 0 warning(s)
 楼主| 发表于 2005-3-11 10:59:00 | 显示全部楼层
LIBRARY "Entities"
EXPORTS
acrxEntryPoint PRIVATE
acrxGetApiVersion PRIVATE
发表于 2005-3-11 13:44:00 | 显示全部楼层

抓狂..免费帮你debug么?

大小写问题.. //函数声明
AcDbObjectId createNewLine();
AcDbObjectId createNewCircle(); //创建直线对象,并返回对象ID
AcDbObjectId CreateNewLine()
{ //创建圆对象,并返回对象ID
AcDbObjectId CreateNewCircle()
{

所以在linking的时候会找不到函数定义(unresolved symbol,即不明标识). 强烈建议要练ARX的人都先熟悉一下VC++的报错系统..
 楼主| 发表于 2005-3-11 13:54:00 | 显示全部楼层
让你费心 我要好好学习 呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 07:35 , Processed in 0.192778 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表