C/C++编译问题速查

时间:2021-12-28 00:58:23

背景

写完功能代码后,通常需要自己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;