Linux下gcc编译c程序生成可执行文件

一、准备 hello.c 文件

1、在当前目录下新建c文件

$:vim hello.c

2、按i进入编辑模式。按esc退出编辑模式,输入源代码

#include <stdio.h>
int main(void)
{printf("hello world");
return 0;
}

退出编辑模式,按住shift+两次z退出(命令行模式下,或者在底行模式下wq)

二、四个步骤

Linux下gcc编译c文件为可执行文件分为四个步骤: 分别是 预编译、编译、汇编、链接

1、预编译( 生成 hello.i 文件)

预编译器cpp 把源代码文件和相关的头文件(如stdio.h)预编译成一个 .i 文件

预编译的过程相当于

$ gcc -E hello.c -o hello.i 或者 $ gcc  hello.c > hello.i

预编译的处理规则:

  1. 将所有的 “#define” 删除,并展开所有的宏定义
  2. 处理所有的条件预编译指令,比如:" #if #ifdef #elif #else #endif "
  3. 处理所有的 “#include” 预编译指令
  4. 删除所有的注释 “//” 、 “/* */”
  5. 添加行号和文件名标识,以便编译时产生的行号信息以及用于编译错误或警告时能够显示行号
  6. 保留所有的 “#pragma” 编译器指令

2、编译(生成汇编代码 hello.s)

编译过程是编译器gcc把预处理完的文件进行词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。

编译过程可以使用如下命令:

$ gcc -S hello.i -o hello.s 或者 $ gcc -S hello.c -o hello.s

都可以得到汇编输出文件 hello.s

3、汇编(生成hello.o文件)

汇编是 汇编器as 把汇编代码转变成中间目标文件。
汇编过程可以使用如下命令:

$ gcc -c hello.s -o hello.o 或者 $ gcc -S hello.c -o hello.o

可以得到中间目标文件

4、链接(生成可执行程序)

链接器 ld:负责将程序的目标文件与所需的所有附加的目标文件连接起来,附加的目标文件包括静态连接库和动态连接库

链接是链接器ld把中间目标文件和相应的库一起链接成为可执行文件。

$ gcc hello.o -o hello

如果前面使用的是$ gcc hello.c命令,默认会产生一个a.out 的可执行文件,使用命令./a.out执行改可执行文件
如果前面使用的是gcc−otesthello.c命令,会产生一个test的可执行文件,使用命令gcc -o test hello.c命令,会产生一个test的可执行文件,使用命令gcc−otesthello.c命令,会产生一个test的可执行文件,使用命令 ./test执行该文件,上述两种方法效果是一样的。

运行可执行文件

./hello

注:上述步骤可以放在一起执行

$ gcc hello.c -o hello
./hello

参考文章

[1]. https://blog.csdn.net/chengzi_comm/article/details/45932417
[2]. https://www.cnblogs.com/judes/p/6999917.html
[3]. https://blog.csdn.net/yeruby/article/details/39450627

Linux下gcc编译c程序生成可执行文件的过程相关推荐

  1. linux下gcc编译c文件生成可执行文件的四个步骤

    Linux下gcc编译c文件为可执行文件分为四个步骤: 分别是 预编译.编译.汇编.链接. 1.预编译( 生成 hello.i 文件) 预编译的处理规则: 1. 将所有的 "#define& ...

  2. Linux系统怎么编译sin,linux下gcc编译sin函数出错的问题

    linux下gcc编译sin函数出错的问题 收藏 Q: I keep getting errors due to library functions being undefined, but I'm ...

  3. Linux下gcc编译中关于头文件与库文件搜索路径相关问题

    如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...

  4. 浅析Linux下gcc编译过程

    目录 1. gcc简介及基本用法 2. gcc编译过程 3. 静态链接和动态链接 4. 静态库和动态库 4.1 静态库的制作和使用 4.2 动态库的制作和使用 1. gcc简介及基本用法   GCC( ...

  5. vs编译c语言文件不读取对象式宏,C代码的条编译宏windows的VS和linux下gcc编译不一样...

    #include #include #define XXX 2 #define YYY 20 int main() { #if(XXX > 10) printf("XXX > 1 ...

  6. linux下gcc编译使用opencv的源文件时报错的处理:undefined reference to symbol '_ZNSsD1Ev@@GLIBCXX_3.4'

    这阵子用OpenCV的sift做了一下匹配,在使用gcc编译时遇到这样的一个报错 /usr/bin/ld: /tmp/cceCEx1F.o: undefined reference to symbol ...

  7. linux下gcc编译conio.h问题

    ubuntu下编译遇到  conio.h找不到文件的问题, conio.h非标准库,在windows平台可以,在linux平台用curses.h,ubuntu下通过sudo apt-get insta ...

  8. linux下mkdir头文件_整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题

    态库./libpos.so. /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so.我们再用源程序 pos_lib.c(见程序5)来创建 ...

  9. linux下gcc编译的四个步骤,linux:gcc编译程序的四个阶段

    gcc的编译流程分为四个步骤,分别为: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) gcc指令的一般格式为:gcc [选项 ...

最新文章

  1. html最小化窗口,[转载]js实现窗口(支持拉伸,拖拽,最大化,最小化,滚动
  2. 直观、形象、动态,一文了解无处不在的标准差
  3. 6.1.2.6 盒子
  4. 两个点击事件共用一个方法_杭州淘宝直播代运营:一个简单的方法,提升直播间封面图点击率!...
  5. 数据结构 二叉搜索树BST的实现与应用
  6. 【mongodb系统学习之十】mongodb查询(二)
  7. Apache Kylin在美团数十亿数据OLAP场景下的实践
  8. 技术人频道的一个问题——“程序员言”
  9. 【DIY】手把手教你爆改一台手机制作掌上游戏机
  10. 听说 TCC 不支持 OpenFeign?这个坑松哥必须给大家填了
  11. 显示杂谈(1)-Gamma到底是个什么鬼
  12. (numpy)python中Array的常用函数
  13. 单片机与上位机的串行通信
  14. JavaScript 杨辉三角 杨辉三角 II
  15. 错误集锦:在安装docker的时候,发现无法安装(没有可用软件包 docker-ce。 错误:无须任何处理)
  16. NFine+Oracle+EF错题集
  17. SEO网站优化第一步:关键词词库表格的建立和关键词分组
  18. 俊成码付出修复版源码
  19. 【C++心路历程18】NOIP2016的心路历程
  20. Unity3D 解决 “SpeedTree materials need to be regenerated.” 导入资源包时出现的错误

热门文章

  1. pfSense关于Meltdown(熔毁)和Spectre(幽灵)漏洞修复的说明
  2. 凡客体,是这样的么【人人都是产品经理:9094】
  3. 美国银行公布2019年第三季度财务业绩
  4. RHCSA学习第六天
  5. html5响应式高端企业disuz模板,高端html5响应式企业disuz模板(商业版)
  6. 尚硅谷以太坊区块链学习(4)
  7. Spring Boot JUnit 测试 Controller
  8. linux-macbook内核,好消息:Linux内核将支持苹果笔记本键盘/触摸板
  9. 【转帖】超详细的 Vagrant 上手指南
  10. 直须看尽洛城花,始共春风容易别