C语言程序环境编译+链接理论

 更新时间:2022年04月27日 08:43:13   作者:不知名小赖  
这篇文章主要介绍了C语言程序环境编译+链接理论,下面文章基于C语言的相关资料展开对编译和链接的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下

一、程序的翻译环境(编译和链接)

在ANSI C 的任何一种实现中,存在两个不同的环境:

  • 第一种是翻译环境,在这个环境中源代码被转换成可执行的机器指令。
  • 第二种是执行环境,它用于实际执行代码。

如下图:就是我们编译器编译一个源文件到一个可执行文件的大致过程

  • 组成一个程序的每个源文件(test.c)通过编译过程分别转换成目标代码(test.obj)
  • 每个目标文件又由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
  • 链接器同时会引入标准c函数库中任何被该程序所用到的函数。

对于一个源文件(test.c)变成最终的二进制文件(test.exe)可以通过下图简单表示:

看上图我们知道:编译又分三步:

预编译 (预处理)(test.c —>test.i)

  • (1)处理所有的注释,以空格代替
  • (2)将所有的#define删除,并展开所有的宏定义
  • (3)处理条件编译指令#if、#ifdef、#elif、#else、#endif
  • (4)处理#include,展开被包含的文件
  • (5)保留编译器需要使用的#pragma指令

编译 (test.i —>test.s)

  • (1)把C语言代码编译成汇编代码
  • (2)进行语法分析,词法分析,语义分析,符号汇总形成符号表

汇编 (test.s —>test.o)

  • 汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每个C语言源程序,都将最终经过这一处理而得到相应的目标文件。 目标文件中所存放的也就是与源程序等效的目标的机器语言代码。

编译完后执行链接,链接会做哪些事呢?

  • 合并段表
  • 符号表的合并和符号表的重定位
  • 最后形成(test.exe)

二、程序的运行环境

  • 程序必须载入内存,在有操作系统的环境中:一般这个由操作系统来完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  • 程序的执行便开始,接着调用main函数。
  • 开始执行程序代码,这个时候程序将使用一个运行时堆栈,存储函数的局部变量和返回地址,程序同时也使用静态(static)内存,存储与静态内存中的变量在程序的整个执行过程一直保留他们的值。
  • 终止程序。正常终止main函数,也可能是意外终止(代码出错)

到此这篇关于C语言程序环境编译+链接理论的文章就介绍到这了,更多相关C语言编译+链接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++指针和数组:字符和字符串、字符数组的关联和区别

    C++指针和数组:字符和字符串、字符数组的关联和区别

    字符串是一种重要的数据类型,但是c语言并没有显示的字符串数据类型,因为字符串以字符串常量的形式出现或者存储于字符数组中。在C++标准模板库(STL)中提供了string类,实现了对字符串的封装。
    2022-12-12
  • 浅析ORB、SURF、SIFT特征点提取方法以及ICP匹配方法

    浅析ORB、SURF、SIFT特征点提取方法以及ICP匹配方法

    这篇文章主要为大家介绍了常用的特征点提取方法(ORB、SURF、SIFT)和ICP匹配方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • 详解C++中的析构函数

    详解C++中的析构函数

    这篇文章主要介绍了C++中的析构函数的相关知识,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C语言实现输出各种三角形

    C语言实现输出各种三角形

    这篇文章主要介绍了C语言实现输出各种三角形方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C++使用QTcreator创建动态库流程

    C++使用QTcreator创建动态库流程

    在工程中,经常会根据不同的场景需求将类封装成库文件,本文主要介绍了C++使用QTcreator创建动态库流程,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • vscode C++远程调试运行(学习C++用)

    vscode C++远程调试运行(学习C++用)

    这篇文章主要介绍了vscode C++远程调试运行(学习C++用),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Opencv开发实现拼图游戏

    Opencv开发实现拼图游戏

    这篇文章主要为大家详细介绍了Opencv开发实现拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C语言结构体简单入门讲解

    C语言结构体简单入门讲解

    这篇文章主要介绍了C语言结构体简单入门讲解,本文讲述了结构体的基本定义和操作,讲解了几个比较实用的函数和案例,希望对你有所帮助
    2021-06-06
  • C++中STL的常用算法总结

    C++中STL的常用算法总结

    这篇文章主要介绍了C++ STL中一些常见算法的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • C语言实现井字棋小游戏

    C语言实现井字棋小游戏

    这篇文章主要为大家详细介绍了C语言实现井字棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04

最新评论