.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可以等价替换成这样
假想变量:避免当前目录下有目标文件时,造成命令无法执行的状况
即时变量、延时变量