嵌入式Linux开发基础一 ——(Ubuntu系统使用gcc和Makefile编译C程序)
本文利用了Ubuntu上gcc和makefile完成了对于“一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;主程序main1.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来”的编写。
目录
1、在ubuntu系统用gcc 命令行方式编译主程序main1.c 并运行
1.2、注:gcc的编译过程被划分为了四个阶段:预处理、编译、汇编和链接,
2、在windows系统下用你熟悉的编译工具编译主程序main1.c 并运行
3、在上述基础上,在ubuntu系统下用Makefile方式编程主程序
一、任务要求:
编写一个子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算(本blog以加法为例子),将结果做浮点数返回;编写主程序main.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。
(1)在ubuntu系统用gcc 命令行方式编译主程序main.c 并运行。
(2)在windows系统下用你熟悉的编译工具编译主程序main.c 并运行。
(3)在上述基础上,在ubuntu系统下用Makefile方式编程主程序。
二、任务解决:
1、在ubuntu系统用gcc 命令行方式编译主程序main1.c 并运行
我目前在Ubuntu上常用的文本编写的命令是nano与vim,本次就选择使用vim来进行编写文本。首先,得在网上查资料安装gcc与vim,这里就不做详细介绍了,因为这不是本文的内容。插曲之后回归本题。
1.1.1、编写主程序main.c文件:
#include"sub1.h"
int main()
{
int a = 5, b = 19;
float sum = x2x(a, b);
printf("%.2f\n", sum);
return 0;
}
1.1.2、编写头文件 sub1.h
#ifndef _SUB1_H
#define _SUB1_H
#include<stdio.h>
float x2x(int a, int b);
#endif
1.1.3、编写sub1.c文件
#include"sub1.h"
float x2x(int a, int b)
{
float sum;
sum = a + b;
return sum;
}
1.2、注:gcc的编译过程被划分为了四个阶段:预处理、编译、汇编和链接,
编译阶段 | 编译命令 | 作用 |
预处理 | 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的文件转化为可执行文件,生成执行程序;
1.3、gcc编译执行
第一步:
输入命令:
gcc -c sub1.c
作用:将sub1.c程序转换为目标文件sub1.o。
第二步:
输入命令:
gcc main.c sub1.o -o main
作用:编译main.c文件为目标文件main.o,然后链接sub1.o目标文件生成main可执行文件。
第三步:
输入命令:
./main
作用:执行编译生成的main程序。
总体实际演示效果如下:
2、在windows系统下用你熟悉的编译工具编译主程序main1.c 并运行
编译工具:Visual Studio 2022;
程序:与Ubuntu系统上一致无区别
编译过程:
sub1.h:
sub1.cpp:
main.cpp:
编译结果:
3、在上述基础上,在ubuntu系统下用Makefile方式编程主程序
注:首先,得在网上查资料安装makefile,这里就不做详细介绍了,因为这也不是本文的内容。插曲之后回归本题。
3.1、makefile编写规则如下:
target:prerequisites
command # command以一个tab键开始
1、# target为一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)
2、# prerequisites是需要生成target所依赖的文件或是目标
3、# command也就是make需要执行的命令。(任意的Shell命令)
4、# rm *.o 用于删除中间产生的无用.o文件
3.2编写Makefile文件并编译
3.2.1、 此处利用vim工具进行对makefile文件的编写:
main:sub1.o main.c
gcc main.c sub1.o -o main
sub1.o:sub1.c
gcc -c sub1.c -o sub1.o
clean:
rm *.o
3.2.3、使用Makefile编译c程序:
三、总结
本次在Ubuntu系统上进行对C语言的编写,我学会并且使用了两种方法:gcc和makefile来进行对编写的程序进行这两种不同的生成可执行文件的方式编译。在gcc的编译中,我第一次深刻的看见与理解到了C语言源程序编译如何变为可执行文件的过程,而不同于像windows上Visual Studio 2022的IDE的“一键编译”,如gcc的四个阶段:预处理、编译、汇编和链接。
在makefile的编译中,我了解到Makefile的作用:就是在执行make命令的时候指定编译和链接的规则,包括源代码文件之间的链接关系、依赖关系等。它关系到整个项目工程的编译规则:哪些文件需要先编译,哪些要后编译,哪些需要重新编译等复杂的操作。同时展示makefile的优点如下:
- 自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- 每次只会编译修改的和依赖于修改的那些文件,提高了编译效率。
参考文章:https://blog.csdn.net/qq_45237293/article/details/108741893
更多推荐
所有评论(0)