实例讲解Linux下的makefile

简介:

1、程序代码结构如下

复制代码
makefile/
|-- Makefile
|-- haha.c
`-- hehe.c
复制代码

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

复制代码
$ cat haha.c 
#include "stdio.h"

int main()
{
    printf("ha ! ha !\n");

    return 0;
}
复制代码
复制代码
$ cat hehe.c 
#include "stdio.h"

int main()
{
    printf("he ~ he ~\n");

    return 0;
}
复制代码

  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 1 normal normal 4940 12-11 16:08 haha
-rw-rw-r-- 1 normal normal   72 12-11 16:03 haha.c
-rw-rw-r-- 1 normal normal  872 12-11 16:08 haha.o
-rwxrwxr-x 1 normal normal 4940 12-11 16:08 hehe
-rw-rw-r-- 1 normal normal   72 12-11 16:03 hehe.c
-rw-rw-r-- 1 normal normal  872 12-11 16:08 hehe.o
-rw-rw-r-- 1 normal normal  279 12-11 16:04 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了,这个调用栈才算到头了。



本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/4157864.html,如需转载请自行联系原作者

相关文章
|
1月前
|
Linux 开发工具 git
Linux嵌入式系统中如何使用U-Boot实例
Linux嵌入式系统中如何使用U-Boot实例
26 0
|
1月前
|
Linux
嵌入式linux系统设备树实例分析
嵌入式linux系统设备树实例分析
36 0
|
1月前
|
Linux 编译器 开发工具
Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
|
1月前
|
IDE Linux 编译器
【Linux】项目自动化构建工具 —— make/Makefile
【Linux】项目自动化构建工具 —— make/Makefile
|
2月前
|
IDE Linux 开发工具
【Linux】Linux项目自动化构建工具-make/Makefile
【Linux】Linux项目自动化构建工具-make/Makefile
【Linux】Linux项目自动化构建工具-make/Makefile
|
1月前
|
IDE 小程序 Linux
【linux】Linux项目自动化构建工具-make/Makefile
【linux】Linux项目自动化构建工具-make/Makefile
27 0
|
2天前
|
Linux 开发工具 C语言
【linux基础(七)】Linux中的开发工具(下)--make/makefile和git
【linux基础(七)】Linux中的开发工具(下)--make/makefile和git
|
3天前
|
Linux 数据安全/隐私保护
Linux常用命令实例带注释
Linux常用命令实例带注释
30 0
|
30天前
|
监控 算法 Unix
【Linux 异步操作】深入理解 Linux 异步通知机制:原理、应用与实例解析
【Linux 异步操作】深入理解 Linux 异步通知机制:原理、应用与实例解析
61 0
|
30天前
|
存储 监控 Linux
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
49 0