博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2021年 ARM嵌入式实战 第3章 C/C++编译常见错误
阅读量:4144 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
万年历
查看>>
作为码农你希望面试官当场指出你错误么?有面试官这样遭到投诉!
查看>>
好多程序员都认为写ppt是很虚的技能,可事实真的是这样么?
查看>>
如果按照代码行数发薪水会怎样?码农:我能刷到公司破产!
查看>>
程序员失误造成服务停用3小时,只得到半月辞退补偿,发帖喊冤
查看>>
码农:很多人称我“技术”,感觉这是不尊重!纠正无果后果断辞职
查看>>
php程序员看过来,这老外是在吐糟你吗?看看你中了几点!
查看>>
为什么说程序员是“培训班出来的”就是鄙视呢?
查看>>
码农吐糟同事:写代码低调点不行么?空格回车键与你有仇吗?
查看>>
阿里p8程序员四年提交6000次代码的确有功,但一次错误让人唏嘘!
查看>>
一道技术问题引起的遐想,最后得出结论技术的本质是多么的朴实!
查看>>
985硕士:非科班自学编程感觉还不如培训班出来的,硕士白读了?
查看>>
你准备写代码到多少岁?程序员们是这么回答的!
查看>>
码农:和产品对一天需求,产品经理的需求是对完了,可我代码呢?
查看>>
程序员过年回家该怎么给亲戚朋友解释自己的职业?
查看>>
技术架构师的日常工作是什么?网友:搭框架,写公共方法?
查看>>
第四章 微信飞机大战
查看>>
九度:题目1008:最短路径问题
查看>>
九度Online Judge
查看>>