(一)用gcc直接编译c程序
1.编写c程序
1.1 我喜欢先用vim 创建一个文件:vim+文件名,随便输入内容 ESC+:+wq 保存退出,即可在可视化文件夹里找到刚刚创建的文件
文章图片
1.2右键点击open with gedit,编写内容
文章图片
文章图片
1.3 用cat+文件名的方式查看文件内容,sub1.c就创建好啦
文章图片
同理main1.c 和sub1.o如下
在这里插入图片描述
文章图片
文章图片
2.gcc的使用原理(以Hello.c为例)
指令 | 编译指令 | 作用 |
---|---|---|
gcc | gcc Hello.c | 生成可执行文件.exe(Linux上为.out) |
-o | gcc Hello.c -o Hello.out(…\Hello.out) | 指定生成的文件名(或者指定文件路径) |
-E(预处理) | gcc -E Hello.c -o Hello.i | gcc将对#开头的指令进行解析,并生成*.i文件 |
-S(编译) | gcc -S Hello.i -o Hello.s | c源码被编译器转化成汇编代码,并生成*.s文件 |
-c(汇编) | gcc -c Hello.s -o Hello.o | 汇编代码转换成机器能执行的二进制代码,并生成*.o文件 |
gcc *.o(链接) | gcc Hello.o -o Hello.out | Demo.o虽然已经是机器码,少了链接操作仍无法运行 |
- 【指令】gcc
使用gcc编译*.c文件可直接生成*.exe(或*。out)
注意:要进入到Hello.c文件的指定目录下,才能执行gcc命令
文章图片
- 【指令】-E(大写)预处理
gcc将对#开头的指令进行解析,生成*.i文件
在预处理阶段需要把调用的头文件包含进来,替换宏常量和宏代码段。
文章图片
查看sub1.i文件内容:
有好多,只截取了一部分,没怎么看懂
文章图片
- 【指令】-S(大写)编译
-S指令将*.i文件中的源码转换成汇编代码*.s文件
文章图片
- 【指令】-c(小写)汇编
将*.s中的汇编代码转换成二进制机器码
文章图片
- 【指令】gcc *.o
经过汇编生成的二进制文件sub1.o虽然已经是机器码,但任然无法运行因为少了链接操作。
文章图片
1.Makefile编写规则
target:prerequisites
command# command以一个tab键开始# target为一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)
# prerequisites是需要生成target所依赖的文件或是目标
# command也就是make需要执行的命令。(任意的Shell命令)
2.示例
文章图片
文章图片
(三)总结
本次实验加深了我对gcc指令的了解,以及运行c程序背后的详细过程,源程序是如何一步步 编译转换成可执行文件的。
借鉴文章:
【嵌入式开发|ubuntu下使用gcc和Makefile执行c程序】不#曾&轻听————Ubuntu系统使用gcc和Makefile编译C程序
大娱乐家cpy————浅显易懂的GCC使用教程——初级篇
推荐阅读
- 安全工具|ubuntu安装CobaltStrike,MSF,john
- Linux|Ubuntu Linux操作系统——图形界面与命令行
- 数据结构|课程设计(飞机订票系统) 超全
- 嵌入式|嵌入式开发(技巧和窍门——提高嵌入式软件代码质量的7个技巧)
- 嵌入式|嵌入式开发(简化传感器的5个技巧)
- Ubuntu五笔输入法安装
- 零基础|从零开始配置vim(21)——会话管理
- 机器学习|TensorFlow 资源汇集
- ubuntu|从零开始搭建oj(ubuntu)