本文共 4363 字,大约阅读时间需要 14 分钟。
一、预处理错误
1.include 出错第1种
include 就是把后面带有的“ ”或< >内容中查找的名字,双引号是在当前路 径查找,而尖括号是在系统环境变量中查找。双引号一般都是用户自己自定义 的头文件,尖括号是系统定义的头文件。
include 最常见的错误是 not find(找不到头文件)实战如下例子说明:
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cat welcome2.c #include <stdio.h>#include <abc.h> //注意:这里是错误的写法 int main(int argc,char* argv[]){ char ch[N] = "hello!"; printf("Welcome,%s\n",ch); return 0; }strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cat abc.h #define N 20
|
注意:编译提示如下信息
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -o build welcome2.c abc.h welcome2.c:2:10: fatal error: abc.h: #include <abc.h> ^~~~~~~ compilation terminated.
|
注意:这里的错误原因是不是在系统环境查找<abc.h>文件,要改成“abc.h” 进行查找才是对的。
2.include 出错第2种
实战第2种错误方法
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cp -rp welcome2.c welcome3.c strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ mkdir -p inc/ strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ mv abc.h ./inc/ strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cat welcome3.c #include <stdio.h> #include "abc.h" int main(int argc,char* argv[]){ char ch[N] = "hello!"; printf("Welcome,%s\n",ch); return 0; } |
注意:这里我头文件移动到创建的inc目录下,在开发大项目的时候都会创建 一定的目录分类。
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -o build welcome3.c welcome3.c:2:10: fatal error: abc.h: #include "abc.h" ^~~~~~~ compilation terminated. |
include第2种错误的解决办法使用gcc -I 头文件目录
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -I ./inc/ -o bulid welcome3.c strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ ./bulid Welcome,hello! |
3.编译语法错误
这种错误如:分号忘记写“;”或者是 { } 写错误了等,这个语法错误根据实际情 况定义。
链接错误
什么链接错误,链接错误就是在最后打包的时候错误,链接所指的是将所有的“.o” 文件进行融合并输出一个可执行文件。链接错误最主要的是“.o”文件和其他元素 不够,比如:你要做一个手工月饼需要原材料,但是这个原材料不够或者多了。
实战链接错误例子1(原材少的原因)
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cat welcome4.c #include <stdio.h> #include "abc.h" void fun(void); int main(int argc,char* argv[]){ char ch[N] = "hello!"; printf("Welcome,%s\n",ch); fun(); return 0; } |
注意:这里只是声明了fun() 函数,但是fun()函数内容没有,这个就是原材料不 够的错误。编译一下看看提示什么信息
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -I ./inc/ -o build welcome4.c /usr/bin/ld: /tmp/cctHebIV.o: in function `main': welcome4.c:(.text+0x44): undefined reference to `fun' collect2: error: ld returned 1 exit status |
注意:collect2错误就是链接错误,在上一章节有详细说明,undefined reference to `fun' ,这个错误就是原材料不够原因引起的。
解决办法是给它添加一个原材料代码如下编写
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cat welcome4.c #include <stdio.h> #include "abc.h" void fun(void); int main(int argc,char* argv[]){ char ch[N] = "hello!"; printf("Welcome,%s\n",ch); fun(); return 0; } void fun(void){ }strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -I ./inc/ -o build welcome4.c |
注意:虽然这个样不报错,但是这个函数没有意义。
实战链接错误例子2(原材少的原因)
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cat abc.c void fun(void){ }strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cat welcome4.c #include <stdio.h> #include "abc.h" void fun(void); int main(int argc,char* argv[]){ char ch[N] = "hello!"; printf("Welcome,%s\n",ch); fun(); return 0; } |
注意:这里是将fun()函数体的内容,另外分配一个”.c”文件。
接着将abc.c和welcome4.c文件进行打包使用gcc -c 命令进行
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -c -I ./inc/ -o abc.o abc.c |
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -c -I ./inc/ -o welcome4.o welcome4.c |
最后将“.o”原材料进行打包得到最后的可执行文件
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -o build abc.o welcome4.o strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ ./build Welcome,hello! |
注意:那如果是原材料多的情况是什么样子的呢?我们来模拟这种现象 看看。
实战原材料多的情况,修改welcome4.c文件代码
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cat welcome4.c #include <stdio.h> #include "abc.h" void fun(void); int main(int argc,char* argv[]){ char ch[N] = "hello!"; printf("Welcome,%s\n",ch); fun(); return 0; } void fun(void){ printf("============\n"); } |
通过gcc -c 和gcc -o 进行编译看一下原材料多的情况
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -c -I ./inc/ -o welcome4.o welcome4.c strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -o build abc.o welcome4.o /usr/bin/ld: welcome4.o: in function `fun': welcome4.c:(.text+0x4f): multiple definition of `fun'; abc.o:abc.c:(.text+0x0): first defined here collect2: error: ld returned 1 exit status
|
注意:这里提示multiple definition,这个意思是多次使用此标签,也就 是原材量多的情况。最多只能保留一个标签,所以这里会报错。
总结 : 预处理错误分为两种: 1) 是使用了系统环境的头文件导致错误。
2)是在开发过程中将头文件单独存放在一个文件中。
3)第2种方式可以使用 gcc -I <头文件目录下的文件> 进行处理预处理报错的情况。
编译错误分为两种: 1)undefined reference to。
2) multiple definition of 。
转载地址:http://pduti.baihongyu.com/