原文链接: 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 深度解析
![]() | 1 zhengxiaowai 2018-04-18 12:44:48 +08:00 cmake 了解一下。。。好久没手写 makefile 了 |
![]() | 2 bigmouthhaile 2018-04-18 13:06:55 +08:00 via Android 对啊,cmake,多方便 |
![]() | 3 hxndg 2018-04-18 13:59:19 +08:00 @zhengxiaowai @bigmouthhaile 你们是什么 py 关系?为啥头像一样的? ps 我看你写的这些字和那些 makefile 感觉和陈皓的《跟我一起写 Makefile 》非常像,不知道有没有什么关系 @Livid 这个算不算是推广? |
4 MeteorCat 2018-04-18 14:02:21 +08:00 via Android 我感觉 cmake 更方便一点,makefile 的学习成本好高 |
![]() | 5 fgodt 2018-04-18 14:04:41 +08:00 via Anroid 还是 cmake 爽点 |
![]() | 6 enenaaa 2018-04-18 14:08:21 +08:00 真的很讨厌写编译脚本。 写程序够辛苦了, 还要被这些莫名其妙的玩意占用时间。 这破事就不能让 ide 搞定吗, 或者分出个专门写编译脚本的工作吧。 |
7 seeker 2018-04-18 14:20:04 +08:00 c/c++ 的最大门槛就这玩意。 |
![]() | 8 bigshot OP @zhengxiaowai 是么 我还没使用过 cmake |
11 linthieda 2018-04-18 19:55:03 +08:00 via iPhone cmake 感觉魔法操作方法 , 编译小工程还是喜欢用 make |
13 iceheart 2018-04-18 21:14:44 +08:00 via Android 还是手写 Makefile 放心,项目里有 java,go,c++,node。要编译打包,不知道 CmakeLists.txt 该咋写,直接写 Makefile 也没几行代码,简单快速直接。 |
14 goodspb 2018-04-18 21:16:56 +08:00 via iPhone http://www.hahack.com/codes/cmake/ 看了这个之后,就一用 cmake 了… |
15 lbtinglb 2018-04-18 21:32:19 +08:00 https://github.com/onqtam/awesome-cmake CMake 保平安。 |
![]() | 16 Ranler 2018-04-18 21:40:39 +08:00 最近看几个 GoLang 项目都是 makefile 管理的,包括 Kubernetes |
19 iwtbauh 2018-04-18 23:18:40 +08:00 via Android 补充: %.c : %.o 是 GNU 语法扩展,不属于 POSIX 的 Makefile 标准,仅适用于 GNU,仅适用于 GNU,仅适用于 GNU 为了可移植性,应该尽量避免使用之 |
![]() | 21 waruqi 2018-04-18 23:27:46 +08:00 via Android 推广一波,换 xmake 吧。用直观简洁的语法来描述工程。http://xmake.io |
![]() | 24 keysking 2018-04-19 08:35:57 +08:00 makefile 还是打扰了,让 CMake 帮我生成吧 |