一、预处理错误
#include “name”: 自定义的。不仅从系统目录中找,也从当前目录中寻找。
#include <name>: 系统定义的。直接会寻找系统环境变量,不会寻找当前目录。
最常见的错误:not found
例子:
>Step 1
abc.h:
#define ABC 10
test1.c:
#include <stdio.h>
#include "abc.h"
int main()
{
int a = ABC;
printf("hello world\n");
return 0;
}
编译pass:

编译pass
>Step 2
如果将test1.c中的”abc.h”,改为<abc.h>:
#include <stdio.h>
#include <abc.h>
int main()
{
int a = ABC;
printf("hello world\n");
return 0;
}
编译fail:

编译fail
>Step 3
将abc.h移动到一个新的目录:inc。
mkdir inc
mv abc.h ./inc/
test1.c中仍找不到abc.h。
gcc -I 查找头文件的目录
gcc -I ./inc -o build test1.c
即可编译pass
二、编译错误
出错最多,主要是语法错误。
如;忘写、{}写错等。
三、链接错误
语法都没问题,最后在打包的时候出错了。
原因:原材料不够,或者原材料多了。
1、原材料不够:undefined reference
解决:进行实现,并且在链接时加入一起进行链接。
test2.c:
#include <stdio.h>
#include "abc.h"
void fun(void); // 只有fun函数的声明,没有实现。因此在调用的时候,原材料不够。
int main()
{
int a = ABC;
printf("hello world\n");
fun();
return 0;
}
编译fail:

undefined reference to 'fun'
解决方法1:直接实现fun函数(增加原材料)
#include <stdio.h>
#include "abc.h"
void fun(void)
{
}
int main()
{
int a = ABC;
printf("hello world\n");
fun();
return 0;
}
解决方法2:在一个新的.c文件(如abc.c)中实现fun函数(原材料)
abc.c:
void fun(void)
{
}
此时,必须把abc.c和test2.c同时打包生成一个可执行文件才行。
gcc -o build test2.c abc.c // 这样写可以,但不建议
// 建议这样写:
gcc -c -o a.o test2.c
gcc -c -o b.o abc.c
gcc -o build a.o b.o
2、原材料多了:multiple definition
解决:寻找是否多次实现,只保留一个实现即可。
abc.c:
void fun(void)
{
}
test3.c也对fun()进行了定义:
#include <stdio.h>
#include "abc.h"
void fun(void)
{
printf("");
}
int main()
{
int a = ABC;
printf("hello world\n");
fun();
return 0;
}
编译fail:
gcc -c -o a.o test3.c
gcc -c -o b.o abc.c
gcc -o build a.o b.o

multiple definition of 'fun'