如何用 Makefile 管理你的工程?

2018-04-18 12:40:20 +08:00
 bigshot

原文链接: https://blog.csdn.net/qq_38646470/article/details/79917494

专栏链接: https://blog.csdn.net/column/details/20028.html

    或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的 IDE 都为你做了这个工作,但我觉得要作一个好的和 professional 的程序员,makefile 还是要懂。在 Linux 下的软件编译,你就不能不自己写 makefile 了,会不会写 makefile,从一个侧面说明了一个人是否具备完 成大型工程的能力。     makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系 列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。     makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。 下面就来看如何写 Makefile 文件: Makefile 文件编写规范:

目标:依赖文件                               
 $^  代表所有依赖文件
 $@  代表所有目标文件
 $<  代表第一个依赖文件
 %   代表通配符
 @指令:屏蔽指令
定义变量(变量大写)
变量名=值 1 值 2 ...
使用变量 $(变量名)

下来看事例: 假设我们有很多个文件( fun1.c fun2.c fun3.c main.h ) 假设最后我们就想得到 main 一个文件 初级版:

.PHONY : clean

main : fun1.o fun2.o fun3.o main.o
	gcc -g fun1.o fun2.o fun3.o main.o -o main
fun1.o : fun1.c main.h
	gcc -Wall -c -g -o fun1.o
fun2.o : fun2.c main.h
	gcc -Wall -c -g -o fun2.o
fun3.o : fun3.c main.h
	gcc -Wall -c -g -o fun3.o

clean :
	rm -rf *.o

精简版

.PHONY : clean

FM=fun1.o fun2.o fun3.o main.o

main : $(FM)
	(前面一个 tab 键)gcc -g $^ -o $@
%.c : %.o
	(前面一个 tab 键)gcc -c -g - Wall $< -o $@
clean :
	(前面一个 tab 键)rm -rf *.o

看看测试效果: 当然 Makefile 还有很多其他的用处,如需更深层次了解请看makefile 深度解析

4660 次点击
所在节点    程序员
25 条回复
waruqi
2018-04-18 23:27:46 +08:00
推广一波,换 xmake 吧。用直观简洁的语法来描述工程。http://xmake.io
bigshot
2018-04-18 23:27:58 +08:00
@iwtbauh 谢谢。
@Ranler 了解,谢谢
bigshot
2018-04-18 23:28:49 +08:00
@waruqi 好的,回头了解下
keysking
2018-04-19 08:35:57 +08:00
makefile 还是打扰了,让 CMake 帮我生成吧
bigshot
2018-04-19 11:44:35 +08:00
@keysking 细说一下,cmake

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/447773

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX