Ubuntu20.04系统使用gcc和Makefile编译C程序
·
文章目录
(一)直接使用gcc编译C程序
1.在终端中安装gcc
- 输入下列命令
sudo apt update
- 回车后输入密码后更新包列表

- 输入下列命令安装软件包
sudo apt install build-essential

- 输入”Y“后回车继续
- 输入以下命令验证gcc编译器是否安装成功
gcc --version

如图出现gcc 9.3.0即表示安装成功!
2.编写C程序
(1)编写一个hello.c文件
- 在Documents中打开终端
- 输入
touch命令创建一个名为hello的文件夹
touch hello.c
- 输入
nano命令打开hello.c文件
nano hello.c
- 写入代码后”ctrl s“保存,然后退出
#include<stdio.h>
int main(void)
{
printf("HELLO WORLD\n");
return 0;
}
- 输入以下命令将hello.c文件进行预处理、汇编、编译并链接形成可执行文件hello,-o选项用来指定输出文件的文件名。
gcc hello.c -o hello
- 输入以下命令得到输出结果(“.”代表当前目录)
./hello
- 运行结果如下

(2)编写一个主程序文件main1.c和子程序文件sub1.c
- 编写main1.c
#include"sub1.h"
int main()
{
int x=2,y=9; //定义x和y变量
printf("%.2f\n",x2x(x,y)); //输出处理后的值,保留两位小数
return 0;
}
- 编写sub1.h
#ifndef __SUB1_H
#define __SUB1_H
#include<stdio.h>
float x2x(int a,int b); //计算b除以a的结果
#endif
- 编写sub1.c
#include "sub1.h"
/*******************/
/* 参数:a,b */
/* 返回值:ans */
/*******************/
float x2x(int a,int b)
{
float ans;
ans=(float)b/a;
return ans;
}
- 输入以下命令将main1.c文件进行预处理、汇编、编译并链接形成可执行文件main1,然后得到输出结果

3.gcc编译过程(以编译hello.c为例)
| 编译阶段 | 编译命令 | 作用 |
|---|---|---|
| 预处理 | gcc -E hello.c -o hello.i | 编译器将源代码中包含头文件编译进来 |
| 编译 | gcc -S hello.i -o hello.s | 检查代码规范性并翻译成汇编语言 |
| 汇编 | gcc -c hello.s -o hello.o | 将.s文件转换为目标文件 |
| 链接 | gcc hello.o -o hello | 将目标文件转换为可执行文件 |
简要理解就是:
预处理:生成 .i 的文件;
编译:将预处理文件转化为汇编语言并生成.s的文件;
汇编:将.s的文件转化为目标文件并生成.o的文件;
链接:将.o的文件转化为可执行文件,生成执行程序;
4.gcc直接编译
-
步骤一
- 命令:
gcc -c sub1.c
gcc -c sub1.c- 作用:将sub1.c程序转换为目标文件sub1.o

- 命令:
-
步骤二
- 命令:
gcc main1.c sub1.o -o main1
gcc main.c sub1.o -o main- 作用:编译main1.c文件为目标文件main1.o,然后链接sub1.o目标文件生成main1可执行文件
- 命令:
-
步骤三
- 执行
./main1命令,即可执行编译生成的main1程序
./main- 作用:执行编译生成的main程序。

- 执行
(二)与windows平台编程对比
- 工具:Visual Studio 2019
- 编写main1.c
#include"sub1.h"
int main()
{
int x=2,y=9; //定义x和y变量
printf("%.2f\n",x2x(x,y)); //输出处理后的值,保留两位小数
return 0;
}
- 编写sub1.h
#ifndef __SUB1_H
#define __SUB1_H
#include<stdio.h>
float x2x(int a,int b); //计算b除以a的结果
#endif
- 编写sub1.c
#include "sub1.h"
/*******************/
/* 参数:a,b */
/* 返回值:ans */
/*******************/
float x2x(int a,int b)
{
float ans;
ans=(float)b/a;
return ans;
}
- 再进行本地调试,开始编译执行代码,结果如下

(三)使用Makefile编译c程序
1.Makefile文件编写规则
target:prerequisites
command # command以一个tab键开始
1、# target为一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)
2、# prerequisites是需要生成target所依赖的文件或是目标
3、# command也就是make需要执行的命令。(任意的Shell命令)
4、# rm *.o 用于删除中间产生的无用.o文件
2.编写Makefile文件并编译
- 编写Makefile文件
main1:sub1.o main1.c
gcc main1.c sub1.o -o main1
sub1.o:sub1.c
gcc -c sub1.c -o sub1.o
clean:
rm *.o
- 使用Makefile编译c程序

(四)总结
- 本次 Ubuntu 系统 C 语言编译实验,采用gcc 直接编译与Makefile 编译两种方式生成可执行文件,核心收获在于跳出 Windows IDE “一键编译” 的黑箱,深入理解了 C 语言源程序到可执行文件的完整流程。
- 通过 gcc 工具手动执行编译、汇编、链接等步骤,清晰掌握了各环节的功能与关联,明确了预处理如何处理头文件与宏定义、编译如何将源码转为汇编指令、汇编如何生成机器码、链接如何整合库文件与目标文件 —— 这些细节在 IDE 自动化操作中易被忽略,却为理解程序运行底层逻辑提供了关键支撑。
- 而 Makefile 的使用,则进一步实践了多文件项目的编译管理,通过定义规则简化了重复编译操作,同时也体会到自动化工具在提升开发效率中的价值,形成了 “手动编译理解原理 + 自动化工具提升效率” 的完整认知,为后续复杂项目开发与问题排查奠定了基础。
更多推荐

所有评论(0)