美文网首页编译
C语言编译 - 编译过程

C语言编译 - 编译过程

作者: 交大小丑 | 来源:发表于2020-06-13 20:50 被阅读0次

一、C语言编译过程简介:

  1. 预处理:替换
  2. 编译:生成目标文件的汇编文件
  3. 汇编:生成目标文件的二进制文件
  4. 连接:生成可执行的二进制文件

1、预处理(Preprocessing)

对源程序中的伪指令(即以#开头的指令)和特殊符号进行处理的过程。
伪指令包括:1)宏定义指令;
      2)条件编译指令;
      3)头文件包含指令;

注意:预处理命令不是关键字

2、编译(Compilation)

编译就是将源程序转换为计算机可以执行的二进制代码。
说明:
  在Linux下,目标文件的缺省后缀为.o
  编译程序将通过词法分析和语法分析,将其翻译成为等价的汇编代码。
  在使用gcc进行编译时,缺省情况下,不输出这个汇编代码的文件。如果需要,可以在编译时指定-S选项。这样,就会输出同名的汇编语言文件。

3、汇编(Assembly)

汇编的过程实际上是将汇编语言代码翻译成机器语言的过程。
产生一个扩展名为.o的目标文件。

4、链接(Linking)

将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。(生成.exe文件)

参考:

【转载】C/C++完整编译过程详解 - ericling - 博客园 https://www.cnblogs.com/ericling/articles/11736681.html

gcc 编译命令

参考:
GCC 编译命令 - iByte - 博客园 https://www.cnblogs.com/ibyte/p/5828445.html

二、C语言的编译过程常见的错误和警告:

1、在预处理阶段:

(1)、error:No such file or directory
中文含义:没有相应文件或目录
错误原因:编译器的搜索路径上找不到所需要的文件。该文件可能已在命令行中指定,或在 #include 语句中说明。
(2)、error: macro or '#include' recursion too deep
中文含义:宏或'#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、在链接阶段:

(1)、error:file not recognized: File format not recognized
中文含义:文件不可识别:文件格式不可识别。
错误原因:文件扩展名不是 ‘.c’。
(2)、error:undefined reference to 'foo'
中文含义:没定义对'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、在运行阶段:

(1)、error while loading shared libraries:cannot open shared object file: No such file or directory
中文含义:装载共享库是出错:
不能打开共享对象文件:不存在该文件或目录
错误原因:程序中使用了共享库,但程序启动时通过动态链接找不到所需的共享库文件。如果确定存在,则请修改共享类库搜索路径变量值LD_LIBRARY_PATH。
(2)、error:Segmentation fault
中文含义:分段错误,总线错误
错误原因:企图访问受保护的内容或覆盖重要的数据! 它指明内存访问错误。
通常的原因如下:
1、反向引用一个空指针或没初始化的指针;
2、超出数组访问的下标;
3、对 malloc, free 和相关函数不正确的使用;
4、使用 scanf 时的参数(数量、类型)不正确。
(3)、error:floating point exception
中文含义:浮点运算异常
错误原因:这是个算术运算异常。如除数为0,上溢、下溢或非法的操作(如对-1 求平方根)。
(4)、error:Illegal instruction
中文含义:非法指令
错误原因:当系统遇到非法的机器指令时,产生此错误。通常此类错误是在源代码已编译成特定机器的目标代码后,又在其它类型的机器上运行时发生。

https://zhuanlan.zhihu.com/p/149627721

相关文章

  • 【初识C语言】编译过程

    C语言编译过程 认识C编译执行过程,是C学习的开端。 我们来简单说C语言从编码编译到执行要经历一下过程: C源代码...

  • C语言编译 - 编译过程

    一、C语言编译过程简介: 预处理:替换 编译:生成目标文件的汇编文件 汇编:生成目标文件的二进制文件 连接:生成可...

  • C语言编译过程详解

    C语言编译过程详解

  • C语言的编译和执行过程

    没有系统的学过C语言,为了了解java编译流程。先简单的略过了一下C语言的编译过程。 C语言在Linux系统下编译...

  • C语言编译过程

    示例代码 a.c head.h head.c 预处理 处理关于 “#” 的指令 删除#define,展开所有宏定义...

  • C语言编译过程

    写在前面 对于C语言,我们大家可能不陌生。工作中经常会使用到,我们在工作中写代码,其中的编译和执行过程都是交给ID...

  • C语言编译过程

    预处理(Pre-Processing) hello.c -> hello.i gcc -E hello.c -o ...

  • 面试常问C++基础

    有关语言基础: c/c++程序的编译过程(GCC的编译流程) 强类型语言 VS 弱类型语言 数组和指针的区别 字符...

  • 【C】C语言编译过程

    1,编译预处理(gcc -E main.c -o main.i) 文件包含复制 将源文件中一"#include"格...

  • JavaScript 编译原理、编译器、引擎及作用域

    首先,JavaScript确实是一门编译型语言,与C等典型编译型语言相比,区别在于JavaScript的编译过程(...

网友评论

    本文标题:C语言编译 - 编译过程

    本文链接:https://www.haomeiwen.com/subject/vlpztktx.html