一个C程序的编译过程(Linux环境下Gcc)

一 以下是C程序一般的编译过程:


 

 从图中看到:

      将编写的一个c程序(源代码 )转换成可以在硬件上运行的程序(可执行代码 ),需要进行编译阶段  和链接这两个阶段。

      其中,

      1.  编译阶段先通过“编译器 “把一个 .c / .cpp 源代码 编译成 .s的汇编代码 ;再经过“汇编器 ” 把这 个.s的汇编代码汇编成 .o 的 目标代码

      2.  “连接器 “ 通过连接其他 .o 代码(如果需要的话) 库文件 和 1 中的.o 目标代码生成可执行文件

该文件流被这三种程序(红色)的加工,分别表现出四种形式(蓝色) ,这就是c程序的编译和链接过程。如果再详细的话,编译器在将源文件编译成汇编文件的过程又分为:预处理阶段(生成 .i代码) 和  优化阶段

 


二、C编程中的文件后缀名介绍

    .c 未经过预处理的C源码
    .h C头文件  
    .i 经过预处理的C源码

    .s 生成的汇编语言代码 
    .o 编译之后产生的目标文件
    解释:*.c一般使我们自己编辑的代码,使我们劳动的结晶;*.h一般是我们手工生成的接口文件,如果愿意,也可在*.c完成后用GCC的选项-aux-info帮我们生成;*.i是经过预处理后的源码,是由GCC在选项-E编译下自动生成的文件;*.o是编译后产生的目标文件;*.s是GCC在选项-S编译下生成的汇编语言代码,对于性能要求很高的程序可以先生成汇编语言文件并对汇编做优化,然后用优化后的汇编生成目标文件并链接

 


三 演示 hello.c 的编译 过程(Linux 下 Gcc)

    

         本小节的演示都针对文件 hello.c 进行

   1. /*
   2.  * hello.c
   3.  */
   4.
   5.   #include <stdio.h>
   6.   int  main()
   7.   {
   8.     printf("
 
Better goal, Better life! /n");
   9.     return 0;
  10.   }


  1.生成预处理后的文件 hello.i

     gcc -E hello.c -o hello.i

  2 .生成汇编语言文件 hello.s

      gcc -s hello.i -o hello.s

   3.生成目标文件 hello.o

      $ gcc -c hello.i
      $ gcc -c hello.s

   4. 生成可执行文件

      $ gcc -o hello hello.o

   5. 运行及结果

      $ ./hello

      Better goal, Better life!

当然也可以直接生成, $ gcc -c hello.c  就可以生成可执行文件。这是Gcc内部的事。但就算是跳跃也要经过一步步的翻译, 原理是相似的,万变不离其宗!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3 django连接mysql 数据库

详情参考&#xff1a; https://blog.csdn.net/weixin_33127753/article/details/89100552 https://imshusheng.com/python/216.html 报错环境 python3.6&#xff0c;django2.2&#xff0c;PyMySQL0.9.3……django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or…

redis 主从复制 [转]

一、Redis的Replication&#xff1a; 这里首先需要说明的是&#xff0c;在Redis中配置Master-Slave模式真是太简单了。相信在阅读完这篇Blog之后你也可以轻松做到。这里我们还是先列出一些理论性的知识&#xff0c;后面给出实际操作的案例。 下面的列表清楚的解释了Redis…

动态查找表之二叉搜索树

一、二叉搜索树&#xff08;BST&#xff09; 二叉搜索树&#xff08;二叉排序树&#xff09;定义如下&#xff1a; &#xff08;1&#xff09;一棵空树&#xff1b; &#xff08;2&#xff09;或者不是空树&#xff1a; 1&#xff09;若左子树不空&#xff0c;则左子树上所有…

Mysql数据导入导出

导出导入数据库导出mysqldump方法mysqldump -u用户名 -p密码名 database [table]> 目标文件导入mysql -uroot -prootuse databasesource 目标文件&#xff1b;PS: 这种方法是导出整个表数据&#xff0c;并且带着建表信息&#xff0c;假如导入的数据库有同名的表&#xff0c;…

2-10 就业课(2.0)-oozie:9、oozie与hue的整合,以及整合后执行MR任务

5、hue整合oozie 第一步&#xff1a;停止oozie与hue的进程 通过命令停止oozie与hue的进程&#xff0c;准备修改oozie与hue的配置文件 第二步&#xff1a;修改oozie的配置文件&#xff08;老版本的bug&#xff0c;新版本已经不需要了&#xff09;这一步我们都不需要做了 修改ooz…

Screen Painter 程序设计

一、Screen 的创建及维护, TCode:SE51 输入程序名称&#xff0c;单击【建立】&#xff0c; 程序1000为SAP预留屏幕号&#xff0c;屏幕号必须定义1000外的其他数字&#xff0c;且最多不超过四位&#xff0c; 本例定义屏幕为SAP预留屏幕号为&#xff1a;100 * 属性设置&#xff1…

完全图解VS2017安装过程并演示VS2017创建Linux项目和调试

VS2017个人免费版即社区官方下载地址为&#xff1a;https://download.microsoft.com/download/D/1/4/D142F7E7-4D7E-4F3B-A399-5BACA91EB569/vs_Community.exe 这是一个很小的在线下载安装器。VS2017安装变得人性化了&#xff0c;根据组件的分类&#xff0c;供安装用户选择&…

spring--打印hello--注解component--自动创建对象

1.创建 GroupId----项目目录&#xff08;com.javaspring&#xff09; Artifactid---项目名称(spring01qiuckstart) Version--版本默认 2.默认打开的pom.xml文件 编辑---编写spring核心项目依赖 <?xml version"1.0" encoding"UTF-8"?> <project …

菜鸟学数据库(四)——超键、候选键、主键、外键

这些年的一些经历告诉我&#xff0c;很多初学者搞不清超键、候选键等&#xff0c;被数据库中的各种键搞的一头雾水。下面就跟大家一起聊聊数据库中的那些键。 首先看看各种键的定义&#xff1a; 超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键 候选键(ca…

嵌入式C语言之struct内存分配分析

本文源于微信号《嵌入式ARM》。链接&#xff1a;http://mp.weixin.qq.com/s/j2mk6jY79nrJge2cDZVH_A 对结构MyStruct采用sizeof会出现什么结果呢&#xff1f;sizeof(MyStruct)为多少呢&#xff1f; 也许你会这样求&#xff1a;sizeof(MyStruct)sizeof(double)sizeof(char)sizeo…

open和fopen的区别

open和fopen的区别&#xff1a; 1.非缓冲文件系统缓冲文件系统是借助文件结构体指针来对文件进行管理&#xff0c;通过文件指针来对文件进行访问&#xff0c;既可以读写字符、字符串、格式化数据&#xff0c;也可以读写二进制数 据。非缓冲文件系统依赖于操作系统&#xff0c;通…

PostMessage发送字符串和结构体

2019独角兽企业重金招聘Python工程师标准>>> 1.首先定义消息变量 #define WM_POST_MSG WM_USER 2 2.增加消息处理函数 afx_msg LRESULT UpdateStatic(WPARAM wParam, LPARAM lParam); 3.增加消息映射 ON_MESSAGE(WM_POST_MSG,UpdateStatic) 当调用PostMessage函…

求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}...

目前想到的一个方法&#xff0c;就是用栈来寻找&#xff0c;说下思想&#xff1a;&#xff08;栈中的data为元素所在的位置&#xff0c;这意味着出栈和进栈的都是索引值&#xff0c;所以比较的时候根据索引找到其值后比较&#xff09; &#xff08;1&#xff09;栈为空&#xf…

SPI、I2C、UART(即串口)三种串行总线详解

以下内容均来源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 几个串口协议学习整理 UART IIC SPI_mainn的博客-CSDN博客 SPI、I2C、UART三种串行总线的原理、区别及应用_嵌入式Linux,的博客-CSDN博客 RS-232 和 UART 之间有什么区别&#xff1f; - 知乎…

select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

从别人的博客中转载过来了这一篇文章&#xff0c;经过重新编辑排版之后展现于此&#xff0c;做一个知识点保存与学习。select函数用于在非阻塞中&#xff0c;当一个套接字或一组套接字有信号时通知你&#xff0c;系统提供select函数来实现多路复用输入/输出模型&#xff0c;原型…

网络4 交换机终端命令

1、switch> 是用户模式 en/enable switch# 是特权模式 conf t/ configure temral switch(config)#是全局模式 int f0/1 /interface f0/1 switch (config-if)# 是接口模式2、show version 显示系统ISO 名称ctrlE 把光标移动到命令行结尾处ctrlA 把光标移动…

解决Office系列安装不上的办法

安装Office时提示“扩展属性不一致”的解决办法&#xff1a;使用系统自带的输入法&#xff0c;Win空格键就搞定了。转载于:https://blog.51cto.com/dreamerhan/1313823

用数据辅助设计-搜索中的实践

设计时不能单凭经验和直觉&#xff0c;因为涉及到的目标人群、场景、操作习惯的不同。为了获取更准确、有效的信息去辅助、检测设计&#xff0c;设计师会选择定性&#xff08;用户访谈、焦点小组&#xff09;和定量&#xff08;调研问卷、网站数据分析&#xff09;的方式进行用…

在IBM服务器安装Windows server 2012的心得

一个简单的问题被我搞复杂了&#xff01; 前些日子&#xff0c;由于连接服务器时卡顿、没有反应&#xff0c;我把服务器强制重启了&#xff0c;之后很不幸地&#xff0c;系统开机进入界面后&#xff0c;不断地转圈圈&#xff0c;一段时间后提示“你的电脑遇到问题&#xff0c;…

fd_set 详解

一、winsock中#include <winsock.h> 原型 int select( int nfds , fd_set* readfds , fd_set* writefds , fd_set* exceptfds , const struct timeval* timeout ); nfds&#xff1a;本参数忽略&#xff0c;仅起到兼容作用。 readfds&#xff1a;&#…