实例讲解Linux下的makefile
2023-09-11 14:18:54 时间
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了,这个调用栈才算到头了。
相关文章
- linux-centos下持续集成工具jenkins部署使用教程
- [Android Memory] Linux下malloc函数和OOM Killer
- 重新梳理Linux系统中Python环境的问题
- 重新整理 .net core 实践篇 ———— linux 上线篇 [外篇]
- Linux基础之查看linux发行版以及内核版本
- 【学习总结】快速上手Linux玩转典型应用-第6章-linux常用命令讲解
- Linux motd详解
- linux(centos8):jmeter5.3并发测试实例(参数在范围内随机取值)
- linux du命令使用:目录大小排序
- 理论+实例,带你掌握Linux的页目录和页表
- 关于linux下自定义的 alias文件和自定义函数库的通用写法(只适合自己的)
- L68.linux命令每日一练 -- 第十章 Linux网络管理命令 -- ping和traceroute
- L60.linux命令每日一练 -- 第九章 Linux进程管理命令 -- top和nice
- L57.linux命令每日一练 -- 第九章 Linux进程管理命令 -- ps和pstree
- L35.linux命令每日一练 -- 第五章 Linux信息显示与搜索文件命令 -- which和whereis
- 使用 Perf 进行基于硬件的性能监视——intel PMU,针对Suse linux
- 检测Linux Rootkit入侵威胁——阿里云是基于行为特征如信号劫持或者文件隐藏,用户提权和网络隐藏,进程劫持等进行检测
- Windows、Linux 连接 RabbitMQ(Maven工程)