.c文件怎么变成可执行的应用程序的?

一些杂谈:

如果同时编译多个文件,一般用到的指令是

gcc - o test a.c b.c ... n.c

执行此命令会将所有的.c文件预处理、编译、汇编一遍,最后链接到一起。如果其中某个.c文件被改动了,那么执行上面这条指令,将把所有的.c文件都动一遍重新输出.o文件再链接。

如果.c文件个数较少,重新处理多个文件不会对系统造成太大的负担,但是如果文件数量过大,只改动一个文件,但是编译却要全部动一遍,将造成不必要的资源浪费,至此有以下解决方案。

先把所有文件输出成.o文件,最后再链接起来,因为上文所说的“所有.c文件都被动一遍”是在链接的时候做的。

gcc -c -o a.o a.c 
gcc -c -o b.o b.c
gcc -o test a.o b.o 

但是有没有发现一个问题,如果每一次编译的时候都这么一个个去敲命令,如果修改的.c文件比较多,记下来也麻烦。

所以,Makefile应运而生!

Makefile大家肯定用过,只是没有注意到而已,它就是相当于Windows系统下面各种IDE,例如vscode、keil等软件上面的编译按钮。一般有普通编译和全局编译,普通编译就是将修改的部分编译就行,全局编译就是所有文件重新编译一遍。

在Linux下,Makefile就是编译按钮,一般是普通编译。该文件在输入make指令以后执行,该文件有固定的编写格式。

例如:

gcc -c -o a.o a.c 
gcc -c -o b.o b.c
gcc -o test a.o b.o

上面这部分的Makefile文件编写

test : a.o b.o
    gcc -o test a.o b.o

a.o : a.c
    gcc -c -o a.o a.c

b.o : b.c
    gcc -c -o b.o b.c

详细解释一下就是判断冒号右侧的文件是否比前面的文件日期更新(即后面的文件被改动了)或者没有目标文件

如果后面文件日期更加新或者没有目标文件,则执行下面的命令。

注意:之所以不是按照先生成a.o再b.o再链接,是因为这样的话如果a.c和b.c文件同时被改动Makefile里面只执行生成a.o文件而不执行生成b.o文件(实测),更不会生成新的test程序。所有最后一步得调到开头。

Makefile几个基本语法,用到再继续查找,做个简单记录:

通配符:%.o(符合.o后缀的文件)、$@(表示目标)、$<(表示第一个依赖文件)、$^(表示所有依赖文件)

上面的Makefile可以等价替换成这样

假想变量:避免当前目录下有目标文件时,造成命令无法执行的状况

即时变量、延时变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值