首页 > 代码库 > 几种典型的C++错误
几种典型的C++错误
1,错误:调试器:: 在进程加载过程中引发了未处理的无法继续的 STATUS_DLL_NOT_FOUND 异常 程序“[3048] text2.exe: 本机”已退出,返回值为 -1073741515 (0xc0000135)。 解决方法:找不到你程序中用到的动态库,把dll文件放在exe文件同一个目录就可以了
2,错误:error C2011: “CAlarm”: “class”类型重定义【转】 在文件头加上了“#pragma once”,“#pragma once”是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,#pragma once用来防止某个头文件被多次include,#ifndef,#define,#endif用来防止某个宏被多次定义。它与 #ifndef __TEST_H__ #define__TEST_H__ 代码 #endif 的作用是一样的。 错误 1 error LNK1104: 无法打开文件“\lib\QtTestd4.lib” D:\getBaseInfo\getBaseInfo\LINK
3,错误:
解决方法:将*.dell文件放到.exe目录下。
4,以文件夹的形式直接使用第三方源文件,需要将源文件放到工程里面。 问题:需要添加有一个第三方的控件,控件自己一个文件夹,但文件夹里面却又带了很多文件夹。里面全是*.js文件,如果手动一个一个右键添加文件夹,在文件夹下添加文件夹的方式来做,则可能有几十个要添加,很麻烦,有什么好办法能一起都添加进去。
方法:复制到项目目录中某个文件夹下。
点工程资源管理器小工具栏中的显示所有文件。
这些文件就会出现,但是是灰色的,表示它们还不属于项目。
点文件夹,右键,选择包含到项目中。
在属性窗格的输出里面选择总是复制。
5,不仅仅是将目录,.lib等配置到VS的路径中去,必要时在程序中也要包含具体的头文件。
6,有时候会报 :错误 47 error LNK2019: 无法解析的外部符号 _ERR_remove_state,该符号在函数 "pu 此种错误加上下面两个库就可以了:?????? D:\server\lib\libeay32.lib D:\server\lib\ssleay32.lib
7,有时候报错:找不到序数459,无法定位序数459于动态链接库。 此种错误只需将libeay32.dll,ssleay32.dll放到*.exe,即工程的可执行目录下即可。???????
8,出现如下错误时: 错误 2 error C2146: 语法错误: 缺少“;”(在标识符“Buffermutex_”的前面) d:\t 错误 1 error C2653: “boost”: 不是类或命名空间名称 d:\testqt\testqt\testqt. 错误 10 error C2039: “scoped_lock”: 不是“boost”的成员 D:\testQT\testQT\testqt.cpp 216 请检查是否包含了所有的头文件。即使属性配置中都正确,也要重新包含下头文件,否则会报找不到。
9,错误 4 error LNK2005: "public: virtual __thiscall boost::property_tree::ptree_error::~ptree_error(void)" (??1ptree_error@property_tree@boost@@UAE@XZ) 已经在 main.obj 中定义 D:\testQT\testQT\testqt.obj 我程序错误的原因是第2条:"头文件的包含重复“。按照提示是property_tree出了问题,检查程序发现在main.cpp中出现如下头文件: #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/json_parser.hpp> 而上述头文件在本工程的testqt.cpp中也出现了,将main.cpp中的去掉就可以了。
造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量。可能存在两种情况: A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test即可,如果还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c?book@@3HA already defined in BBB.obj。切记的就是不能给变量赋值否则还是会有LNK2005错误。 这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义: (1)声明必须使用extern关键字;(2)不能给变量赋初值 所以,下面的是声明: extern int a; 下面的是定义 int a; int a = 0; extern int a =0; B、对于那么编程不是那么严谨的程序员,总是在需要使用变量的文件中随意定义一个全局变量,并且对于变量名也不予考虑,这也往往容易造成变量名重复,而造成LNK2005错误。
2.头文件的包含重复。往往需要包含的头文件中含有变量、函数、类的定义,在其它使用的地方又不得不多次包含之,如果头文件中没有相关的宏等防止重复链接的措施,那么就会产生LNK2005错误。解决办法是在需要包含的头文件中做类似的处理:#ifndef MY_H_FILE //如果没有定义这个宏 #define MY_H_FILE //定义这个宏 ……. //头文件主体内容 ……. #endif 上面是使用宏来做的,也可以使用预编译来做,在头文件中加入: #pragma once //头文件主体 3.使用第三方的库造成的。这种情况主要是C运行期函数库和MFC的库冲突造成的。具体的办法就是将那个提示出错的库放到另外一个库的前面。另外选择不同的C函数库,可能会引起这个错误。微软和C有两种C运行期函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个错误,一般情况下它需要MFC的库先于C运行期函数库被链接,因此建议使用支持多线程的msvcrt.lib。所以在使用第三方的库之前首先要知道它链接的是什么库,否则就可能造成LNK2005错误。如果不得不使用第三方的库,可以尝试按下面所说的方法修改,但不能保证一定能解决问题,前两种方法是微软提供的: A、选择VC菜单Project->Settings->Link->Catagory选择Input,再在Ignore libraries 的Edit栏中填入你需要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。然后在Object/library Modules的Edit栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序,呵呵,God bless you! B、选择VC菜单Project->Settings->Link页,然后在Project Options的Edit栏中输入/verbose:lib,这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。 C、选择VC菜单Project->Settings->C/C++页,Catagory选择Code Generation后再在User Runtime libraray中选择MultiThread DLL等其他库,逐一尝试。 关于编译器的相关处理过程,参考: http://www.donews.net/xzwenlan/archive/2004/12/23/211668.aspx
这就是我所遇到过的LNK2005错误的几种情况,肯定还有其他的情况也可能造成这种错误,所以我不希望你在看完这篇文章以后再遇到LNK2005错误时候,不动脑筋的想对号入座的排除错误。编程的过程就是一个思考的过程,所以还是多多开动你的头脑,那样收获会更多! 从某人的博客找到的: 解决方案一: 把主函数所包含的操作函数.cpp,改为头文件.h,然后就可以解决如上错误。 解决方案二: 重新打开编译器,重新打开刚才的文件,先打开主函数.cpp,然后编译运行,打开Fileview,其中有一个external dependencies,把头文件.h,和操作函数.cpp添加到这里,这样再编译运行主函数.cpp,程序运行成功! 偶遇到的应该是CSDN里提到的第一种情况,可是偶是用某人博客的解决方案一解决问题的,学习了。。。
10,testB.cpp(6) : error C2027: 使用了未定义类型“A”
d:\dxsdk\Extras\DirectShow\Samples\C++\DirectShow\course_client2\destop capture filter\testB.h(4) : 参见“A”的声明
testB.cpp(6) : error C2227: “->aMethod”的左侧必须指向类/结构/联合
程序如下:
testA.h:
#if !defined(_a_)
#define _a_
#include "testB.h"
class A{
public:
B b;
public:
aMethod();
};
#endif
testA.cpp:
#include "testA.h"
A::aMethod(){
}
testB.h
#if !defined(_b_)
#define _b_
//# include "testA.h"<--这个Include了也不好使
class A;
class B{
public:
A * a;
public:
setA(A*a);
bMethod();
};
#endif
testB.cpp
#include "testB.h"
B::setA(A*a){
this->a=a;
}
B::bMethod(){
a->aMethod();
}
解决方法:
testB.cpp
#include "testB.h"
#include "testA.h"
原因:
类B中只有类A的指针,那么定义类B时有个类A的前向声明也就可以了,
但类A中使用类B做为成员,所以定义类A时要看到类B的完整定义.
几种典型的C++错误