本文迁移自本人网易博客,写于2011年1月13日,使用VC时一些容易犯的错误 - lysygyy的日志 - 网易博客 (163.com)
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时,最后一个元素总是跑到第一个,数组形参最好都用引用,若用指针,地址可能会循环到最后一个。