使用VC时一些容易犯的错误

原文链接: http://lysygyy.blog.163.com/blog/static/176577005201101361525465/


1、在调用其他类中的函数时,需要在当前类中声明一个类对象,但是调用的时候,编译会出错。出现很多@符号,无法处理外部标识,这种错误我一连犯过好几次,其实是在复制函数定义的时候,在函数名前没有写类名。

2、error LNK2005: "class AdditionalClass additionalClass" (?additionalClass@@3VAdditionalClass@@A) already defined in StdAfx.obj

LINK : warning LNK4098: defaultlib "msvcrt.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
Debug/Transverse.arx : fatal error LNK1169: one or more multiply defined symbols found

 将项目设置-c++-Code Generation-Use runtime library,改为Multithreaded Dll,警告LNK4098没有了

 

终极解决办法:
在 Project/Setting/Link/General中的 Project Options: 加入 /FORCE:MULTIPLE即可。

终于没有错误了,但是依然有警告:

LINK : warning LNK4075: ignoring /INCREMENTAL due to /FORCE specification
TransverseCommands.obj : warning LNK4006: "class AdditionalClass additionalClass" (?additionalClass@@3VAdditionalClass@@A) already defined in StdAfx.obj; second definition ignored
TransverseCommands.obj : warning LNK4006: "class AdditionalClass additionalClass" (?additionalClass@@3VAdditionalClass@@A) already defined in StdAfx.obj; second definition ignored
   Creating library Debug/Transverse.lib and object Debug/Transverse.exp
Debug/Transverse.arx : warning LNK4088: image being generated due to /FORCE option; image may not run

 

Link时出现:

LINK : warning LNK4075: 忽略”/EDITANDCONTINUE”(由于”/INCREMENTAL:NO”规范)


这个问题是因为在vc6中,工程使用的增量编译。
解决办法:
属性,链接器,常规,启动增量链接 选择 是(INCREMENTAL)

其实这个问题,还是自己编码的问题,默认的环境是没有问题的,根本不需要修改设置的。在VC++程序中默认有一个全局的变量theApp,看一下这个全局变量用法就知道该如何定义全局变量了,其实自己以前使用过的。只是到了今天才发现C++原来这么高深莫测,自己以为很简单的使用方法背后有那么复杂的理论基础。

定义全局变量的方法:在cpp文件中定义全局变量后(不能在头文件中定义,因为若多个文件都有包含这个头文件,会多次编译,导致出现重复定义的错误),在其他要使用该全局变量的类的头文件中使用extern来声明。如果看过C++经典面试题的话,应该就有印象了,当时我是死记硬背的,知道这个extern是用来避免重复定义的,到了今天才理解。

3、debug版本没有,release版本却有这个错误

LINK : warning LNK4089: all references to "AcGe15.dll" discarded by /OPT:REF

我将AcGe15.lib加入到项目设置的导入库中,再将stdafx.h中与acge库有关的头文件删除(只要程序不提示错误就行)后,警告清除了

4、在使用ObjectARX时,想使用MFC库中的函数和类(CString、AfxMessageBox),添加了类的头文件#include <afx.h>,却出现如下错误:

fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>


在vc中写代码会遇到windows api和mfc混合使用,比如查找一个目录是否存在,有人很喜欢用CFileFind(其实可以#include <io.h>用access判断)同时又include了windows.h这样如果windows.h在mfc的几个头文件前面就会报fatal error C1189: #error :?WINDOWS.H already included.MFC apps must not #include <windows.h>,解决方法把mfc的几个头文件移到最前面,注释掉windows.h。

这样之后CString是可以用了,但是AfxMessageBox仍然不可用.

error C2065: 'AfxMessageBox' : undeclared identifier
AfxMessageBox调用头文件#include <afxwin.h>,将其加入stdafx.h中报错:

nafxcw.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in Transverse.obj
nafxcw.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in Transverse.obj; second definition ignored
   Creating library Release/Transverse.lib and object Release/Transverse.exp
LINK : warning LNK4098: defaultlib "mfc42.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib "mfcs42.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib "msvcrt.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
../BIN15/Transverse.arx : fatal error LNK1169: one or more multiply defined symbols found

将 mfc42.lib加入项目设置导入库,并设置为User mfc in a shared dll后,出现如下错误:

mfcs42.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in Transverse.obj
mfcs42.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in Transverse.obj; second definition ignored
   Creating library Release/Transverse.lib and object Release/Transverse.exp
../BIN15/Transverse.arx : fatal error LNK1169: one or more multiply defined symbols found

工程->设置->c/c++->预处理器 删除_USRDLL,错误都没有了

5、使用ObjectARX时,AcDbGroup类的对象,pGroup->append(objId),时,出现eHasMultipleReaders错误。

原因:在增加和删除实体之前,要先关闭对象。pObje->close();pGroup->append(objId);这样就OK了。

6、使用ObjectARX添加扩展数据时,这一行es = pObj->setXData(pRb);提示错误写入扩展数据错误:126,代码126是指eRegappIdNotFound。

写入扩展数据错误:52,52指eBadDxfSequence。

搞了半天,原来那个应用程序名没有注册,直接就往结果缓冲区链表中添加数据了,应该先注册acdbRegApp(szAppName);第无数次地尝到了抄袭代码带来的巨大悲痛啊!

7、AcDbTextStyleTable添加记录时,blockTable->append(textId, blockTableRecord);这一行会提示错误:eNotOpenForWrite,但此时,blockTable明明是Adesk::kForWrite的。

错误信息:内部错误:!U:\global\src\ObjectDbx\DB\IMP\src\dbobji.cpp@5619:eNotOpenForWrite。

也许是我装的ObjectARX2002的问题吧,我测试了N种情况,只要跟文本样式的AcObjectId有关就会提示这个错误。直接在AutoCAD2002中绘制文字,也没有办法加粗文字的。

应该是最初没有一行一行都跟踪返回一个值吧,最后经过老师指点,发现不是那一行的错误,只好一行一行找,最终找到错误在这一行pText->setTextStyle(textStyleId);前面有pText设置过了,这里应该是pText1,原来是写错了对象了。

8、在使用acedGetString时,如何实现:用户输入非法可重新输入,若按回车或Escape取消输入;

目前使用该函数时,用户输入一个字母后,光标会跑到这个字母的前面,导致输入顺序倒置,如何处理?

,”n请输入一个字符串:”,
提示字符串长度要是偶数,不包括’n’

9、使用AcDbPoint3dArray时,最后一个元素总是跑到第一个,数组形参最好都用引用,若用指针,地址可能会循环到最后一个。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值