实例讲解Linux下的makefile

时间:2023-03-09 00:22:21
实例讲解Linux下的makefile

1、程序代码结构如下

makefile/
|-- Makefile
|-- haha.c
`-- hehe.c

  1.1、需要被编译的源代码如下

$ cat haha.c
#include "stdio.h" int main()
{
printf("ha ! ha !\n"); return ;
}
$ cat hehe.c
#include "stdio.h" int main()
{
printf("he ~ he ~\n"); return ;
}

  1.2、makefile的脚本如下

$ cat Makefile
.PHONY : dummy CFLAGS =
LDFLAGS = ALL_FILES = hehe haha all : $(ALL_FILES) hehe : hehe.o
gcc -o hehe hehe.o hehe.o : hehe.c
gcc -c hehe.c -o $@ haha : haha.o
gcc -o haha haha.o haha.o : haha.c
gcc -c haha.c -o haha.o clean : dummy
rm -rf *.o
rm -rf $(ALL_FILES)

  1.3、执行make命令后的编译结果

$ make
gcc -c hehe.c -o hehe.o
gcc -o hehe hehe.o
gcc -c haha.c -o haha.o
gcc -o haha haha.o
-rwxrwxr-x  normal normal  - : haha
-rw-rw-r-- normal normal - : haha.c
-rw-rw-r-- normal normal - : haha.o
-rwxrwxr-x normal normal - : hehe
-rw-rw-r-- normal normal - : hehe.c
-rw-rw-r-- normal normal - : hehe.o
-rw-rw-r-- normal normal - : Makefil

这样我们需要的程序就编译出来了。文件结构如下

makefile/
|-- Makefile
|-- haha
|-- haha.c
|-- haha.o
|-- hehe
|-- hehe.c
`-- hehe.o

多出来了4个文件,haha、haha.o、hehe、hehe.o

  1.4、执行结果

$ ./haha
ha ! ha !
$ ./hehe
he ~ he ~

  1.5 执行命令make clean,结果如下

$ make clean
rm -rf *.o
rm -rf hehe haha

多出来的文件都被删除了,接下来对makefile的脚本文件进行一下讲解。

2、下面是对makefile文件的讲解

  2.1、在make命令执行后,会在当前目录下搜索makefile、Makefile。如果当前目录没有这个两个文件的话就会报错:找不到makefile

$ make
make: *** 没有指明目标并且找不到 makefile。 停止。

  2.2、现在把Makefile改名,用参数-f 来指定要加载的脚本文件也是可以顺利编译的。

$ mv Makefile realmake
$ make -f realmake
gcc -c hehe.c -o hehe.o
gcc -o hehe hehe.o
gcc -c haha.c -o haha.o
gcc -o haha haha.o

  2.3、在Makefile脚本中,make会默认寻找第一个目标进行编译。比如上面的Makefile中,make会从上到下进行扫描,当扫描到“all :”的时候,终于找到一个目标了,然后就会对这个目标进行操作。当make发现这个all需要$(ALL_FILES)的时候,时候就会去寻找$(ALL_FILES)。但是,make在加载脚本的时候会把ALL_FILES变量进行置换为hehe haha,所以换成了寻找hehe和haha进行编译。当执行hehe的时候又发现需要hehe.o,然后又去寻找hehe.o,如此循环寻找吧,直到hehe.c的时候,终于在当前目录找到hehe.c了,这个调用栈才算到头了。