C++新手常见低级错误

6 篇文章 0 订阅
6 篇文章 0 订阅
0. 一个dll工程,编译后不生成lib,可能因为,导出的头文件没有被cpp包含,比如faceApi.h是暴露出去的头文件,但是faceApi.cpp没有包含“faceApi.h”,此时可能会出现该问题;
1. 引用lib时,提示无法打开输入文件xxx.lib,此时需要将xxx.lib放到工程的目录下(...\...\test\test),而不是与使用该lib的源文件放在一个目录下(...\...\test\test\FaceRec);

2. 用cvSetROIImage函数时,一定要把感兴趣区域拷贝出来;

3. 提示“ 无法解析的外部符号”,可能的问题是没有包含lib库,另一种情况是:类的成员函数实现是没有加-类名::,如:
int
CtvitLBP::GetFeature(IplImage* grayImage, float* lbpFeature)
int
GetFeature(IplImage* grayImage,float* lbpFeature)
少了"CtvitLBP::";

如果包含了lib,并且lib也在正确的目录下,此时可能是lib生成错误,比如,生成lib的头文件跟cpp文件的函数定义不一致,需查看后再重新编译;


4. 提示缺少参数列表(回调函数),是因为回调函数不能够用成员函数,此时可以定义为全局函数或者静态成员函数;

5. 提示找不到xx.cpp文件,是因为在工程中添加该源文件了,但是在物理位置上将该文件删除了。

6. debug跟release有时候会不一样,记得重新编译;

7. 编译错误时,如果很明显不是错误的,那么要注意是不是低级错误,比如大括号不匹配。

8. 编译报
     error C2146: 语法错误: 缺少“;”(在标识符“faceCharacter”的前面)
     error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
     error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
     可能是因为没有包含对应的头文件。系统怀疑默认为int。
9.   C编译器不能解释模板,如模板函数、模板类等,所以当
     #ifdef __cplusplus  
     extern "C" { 
     #endif  
     中包含模板的定义时,会出现编译问题。
10. 当C++调用C语言的函数时,需要加上
     #ifdef __cplusplus  
     extern "C" {  
     #endif  
     因为C编译器编译与C++编译器对函数名的处理不一致。C语言在生成目标文件时直接在函数名前加下划线,而C++编译器在生成目标文件时在函数名前加下划线,并且在后面加上参数的数据类型,这样会导致C++调用C函数时找不到目标函数。
     参加:http://songpengfei.iteye.com/blog/1100239
11.共享内存导致内存错乱,可能引发意想不到的错误。
12.memset和memcpy时注意内存长度一定要与申请的内存空间一直,否则会非法访问其他成员的内存,导致意想不到的问题。
13.当变量的值与变得莫名其妙时注意其数据类型是否正确。
14.利用new申请内存空间时,如果申请失败,默认是抛出异常,而不是返回空指针,所以要么捕获异常,要么利用no throw方式。
15.如果两层循环,尽量将循环次数多的放在内循环;
16.如果循环内有判断,尽量移到循环外;
17.c++中尽量用const代替宏定义;
18.当程序出现很离奇的错误时,比如说分配空间失败等,很可能是内存越界问题,可以查看附近申请内存和初始化内存是否有错误,比如:float *pf = new float[100]; memset(pf, 0, sizeof(double)*100),类型错误,访问越界。
19.若在一个类中引用成员变量时,报未声明的变量,此时可能该函数没有定义为成员函数,所以不能访问成员变量

20.C#调用C++的dll时,报错“试图访问格式不正确的程序”,解决方案:将C#和C++项目的目标平台设置为一样的,如都设置为x86,C#项目一定要设置红框表示的位置,只设置上面的平台不管用。
还有一个可能就是其他dll不正确,可以用命令行的方式测试dll是否正确;k
PS: [ DllImport ( "CtvitFaceCatalogueClrSDK.dll" , EntryPoint = "Init" , CallingConvention = CallingConvention .Cdecl)]
        public static extern int Init( char *workRoot);

21.使用memset时注意是否需要&符号,以及sizeof中的类型是否与变量类型匹配。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值