C语言的编译过程常见的错误和警告
C语言的编译过程:
一、 C语言编译过程
C语言的编译过程可分为四个阶段:
1、预处理(Preprocessing)
对源程序中的伪指令(即以#开头的指令)和特殊符号进行处理的过程。
伪指令包括:1)宏定义指令;
2)条件编译指令;
3)头文件包含指令;
2、编译(Compilation)
编译就是将源程序转换为计算机可以执行的二进制代码。
说明:
在Linux下,目标文件的缺省后缀为.o
编译程序将通过词法分析和语法分析,将其翻译成为等价的汇编代码。
在使用gcc进行编译时,缺省情况下,不输出这个汇编代码的文件。如果需要,可以在编译时指定-S选项。这样,就会输出同名的汇编语言文件。
3、汇编(Assembly)
汇编的过程实际上是将汇编语言代码翻译成机器语言的过程。
产生一个扩展名为.o的目标文件。
4、链接(Linking)
将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。(生成.exe文件)
C语言在编译过程中常见的error或warning:
1、在预处理阶段:
错误原因:编译器的搜索路径上找不到所需要的文件。该文件可能已在命令行 中指定,或在 #include 语句中说明。
中文含义:宏或'#include' 递归太深
错误原因:语句 #include 嵌套太深。当预处理器遇到太多嵌套的 #include 指令时,会导致此错误。通常该错误由两个或多个文件进行相互引用时,会引发无限递归。
(3)、error:invalid preprocessing directive #...
中文含义:非法的预处理命令#...
错误原因:该错误指明预处理器遇到了不可识别的 # 命令。
(4)、error:unterminated '#if' conditional
中文含义:'#if' 语句条件没有终止
错误原因:缺少 #endif 语句
2、在编译阶段:
(1)、error:'variable' undeclared (first use in this function)
中文含义:变量'variable' 没有声明(第一次使用此变量)
错误原因:你没有声明‘variable’;
(2)、error:conflicting types for 'Alex'
中文含义:对 'Alex' 变量存在突出类型
错误原因:前面可能已对 'Alex' 声明了其它数据类型。
(3)、error:too many types in declaration
中文含义:在声明中定义太多的类型
错误原因:少了逻辑运算符关系,关系运算符之类的符号
(4)、warning: comparison between pointer and integer
中文含义:警告:对指针和整型值进行比较可能没问题。此警告通常是由'if (strstr(line,"word") != NULL )' 之类的strstr 函数返回指针或空值。
编译时可能遇见的error或warning太多了,我只列出了几个;
3、在链接阶段:
中文含义:文件不可识别:文件格式不可识别。
错误原因:文件扩展名不是 ‘.c’。
中文含义:没定义对'foo' 的引用。
错误原因:程序中使用了在本文件和其它库中没有定义的函数或变量。有可能是丢失了链接库,或使用了不正确的名字。
(3)、error:usr/lib/crt0.o: Undefined symbol _main referenced from textsegment
中文含义:从文本段引用没定义的_main 符号
错误原因:缺少 main()函数—但实际上有,为什么?
1.在头文件中可能存在语法错误;
2.在C 源文件中可能缺少gcc 命令
(4)、error:Undefined symbol _initscr referenced from text segment
中文含义:从文本段引用没定义的_initscr 符号
错误原因:调用了一个函数,但并没有该函数,或在#include 语句中没有包含该函数的库。
4、在运行阶段:
中文含义:装载共享库是出错:
不能打开共享对象文件:不存在该文件或目录
错误原因:程序中使用了共享库,但程序启动时通过动态链接找不到所需的共享库文件。如果确定存在,则请修改共享类库搜索路径变量值LD_LIBRARY_PATH。
中文含义:分段错误,总线错误
错误原因:企图访问受保护的内容或覆盖重要的数据! 它指明内存访问错误。
通常的原因如下:
1、反向引用一个空指针或没初始化的指针;
2、超出数组访问的下标;
3、对 malloc, free 和相关函数不正确的使用;
4、使用 scanf 时的参数(数量、类型)不正确。
中文含义:浮点运算异常
错误原因:这是个算术运算异常。如除数为0,上溢、下溢或非法的操作(如对-1 求平方根)。
中文含义:非法指令
错误原因:当系统遇到非法的机器指令时,产生此错误。通常此类错误是在源代码已编译成特定机器的目标代码后,又在其它类型的机器上运行时发生。
yo!peace!
C语言的编译过程常见的错误和警告相关推荐
- -i 可以编译添加多个_C语言的编译过程
大家对C语言的编译过程可能有个大致的理解,但是,详细到每一步具体都干了啥,可能有的人不是很清楚啦,也包括我,要不然,就不会做笔记了,哈哈... 0.主要步骤 ① 步骤 编写源程序(.c) → 预处理 ...
- c语言的编译过程,从文本到可执行文件
从文本文件到可执行文件 以hello world举例. #include<stdio.h> int main(){printf("hello,world!\n");re ...
- c语言的编译过程详解
c语言的编译过程详解 IDE的使用让很多和我一样的人对C/C++可执行程序的底层生成一知半解,不利于我们深入理解原理.在这里小结一下,望路过的大神指正~ 前言:从一个源文件(.c文件)到可执行程序到底 ...
- Linux上C语言程序编译过程详解
点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 本文将介绍如何将高层的C/C++语言编写的程序转换 ...
- 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C语言程序编译过程 2
C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作 ...
- .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
.NET语言的编译分为两个阶段.首先高级语言被编译成一种称作IL的中间语言,与高级语言相比,IL更像是机器语言,然而,IL却包含一些抽象概念(比如:类.异常),这也是这种语言被称为中间语言的原因.IL ...
- Xcode中常见的错误,警告和解决方法
1.Info.plist Utility Error: "Info.plist couldn't be opened because there is no such file" ...
- c语言编译生成cpp,C语言的编译过程
编译: 编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序. 流程:C ...
最新文章
- IoT	、5G与边缘计算将会擦出怎样的火花?
- 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( No module named ‘numpy‘ )
- 漫谈 C++ 的各种检查
- c#winform演练 ktv项目 通过下标选中歌曲并且列表高亮
- 弱电箱只埋了一根网线时,如何上网和IPTV兼顾?
- 计算机专业毕业论文题目大全集
- JUC —— 常用辅助类
- 论文阅读《High-Definition Map Generation Technologies For Autonomous Driving: A Review》1
- 武职计算机网络技术专业,武汉职业技术学院计算机系
- 安装arm_qt交叉编译环境(亲测有效)
- OTT与IPTV的区别是什么?
- 软件测试周刊(第69期):说出观点需要勇气,说好笑则需求智慧。
- 汪子嵩:论有、存在与是(如是——真如)
- 【离散】如何利用顶点数求树叶或知树叶求顶点
- 2008春天在玉渊潭看到传说中的榆钱树
- 基于stm32的模拟楼道光控开关的实验
- 非线性方程线性化求参数的简单例子
- 2015南阳CCPC E - Ba Gua Zhen 高斯消元 xor最大
- 使用Flex实现常见布局的思路总结
- CHIL-ORACLE-修改密码