背景
写完功能代码后,通常需要自己review几遍。review完之后,就可以开始编译。编译过程中通常会出现些错误,为了快速解决编译错误,下面整理了些常见编译错误的解决办法。
第三方头文件和库缺失
示例: 编译过程中出现下面的错误:
configure: error: missing dis-asm.h
解决办法:
yum install binutils-devel binutils-devel.x86_64
交叉include头文件
是指在两个独立结构的类的头文件中需要互相使用彼此类型,各自include了对方的头文件。
示例: a.h:
....
#include <b.h>
....
Class A {
int a;
B b;
};
A() {};
~A() {};
而另外一个头文件b.h 如下:
....
#include <a.h>
....
Class B {
int b;
A a;
};
B() {};
~B() {};
上面这种使用方式是新手常常容易犯的错误,可能会导致许多莫名其妙的编译错误。针对这种问题,最主要的思路就是充分利用C/C++ 声明和实现分开定义的特点。上面改成下面这样就不会有错误了:
示例: a.h:
//#include <b.h>
Class B;
Class A {
int a;
B b;
};
A() {};
~A() {};
而另外一个头文件b.h 如下:
....
//#include <a.h>
class A;
....
Class B {
int b;
A a;
};
B() {};
~B() {};
那么什么时候需要include 类的头文件呢,需要在使用头文件种声明的函数的时候才需要;如果没有使用声明一个外部类。
类型不匹配
常见的类型不匹配包括: a. 参数数量不匹配; b. 参数类型不匹配; c. 返回值不匹配 d. 声明种定义种的元素类型不匹配; e. 指针类型不匹配; f. 函数指针类型不匹配;
这些编译错误信息通常在日志张都能看到。如果没有编译输出,对于CMake 可以通过make VERBOSE=1去分析;对于makefile 生成的Makefile, 可以通过make V=1 去生成编译信息。
强制转换类型不对
通常的错误包括: a. 非void* 类型的变量通过void 类型的变量赋值 示例如下:
void * pvoid = nullptr;
char * str = pvoid;
b. staic/const cast指针类型转换失败 示例如下:
const void * pvoid = nullptr;
char * str = pvoid;
str = (char *)pvoid;