美文网首页编译
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语言编译 - 编译过程

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