make/Makefile
1.背景
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,
makefile
定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile
带来的好处就是——“自动化编译”,一旦写好,只需要一个make
命令,整个工程完全自动编译,极大的提高了软件开发的效率。make
是一个命令工具,是一个解释makefile
中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。make
是一条命令,makefile
是一个 文件,两个搭配使用,完成项目自动化构建。
2.概念
make
和Makefile
是在类 Unix 系统(包括 Linux 和 macOS)中广泛使用的构建工具和技术。
make
是一个命令行工具或者说是一个程序,它的主要作用是根据用户提供的规则去编译和链接程序源代码。当你运行make
命令时,它会查找一个名为Makefile
或者GNUmakefile
的特殊文件,并遵循其中的规则来确定应该执行哪些操作。这些规则通常指示了如何基于源代码文件构建可执行文件或其他输出文件,以及在什么条件下(例如某些源文件发生变化时)才需要重新编译。
Makefile
是一个文本文件,其中包含一系列构建项目的规则和命令。它定义了源文件、目标文件、依赖关系以及用于构建项目的命令。
3.实例代码
例如:
补充:
.PHONY
上面提过
.PHONY:XXX
后面的XXX
总会被执行
makefile
怎么知道我的程序是否需要被编译?
答:通过对比可执行文件和源文件的最近修改时间,若源文件最近修改时间比可执行文件新,则需要重新被编译,make
可以被执行,否则make
不能被执行。
makefile/make
会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。
会发现上面makefile
中首先执行的时code.o
被链接,源文件中没有code.o
,但最后仍然能被执行,原因就是makefile/make
会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。,可将这个过程理解为通过栈实现的过程
所以即使我们打乱上面的makefile文件中的依赖方法顺序,源文件依然能正常编译执行。
注意:最终要形成的文件一定要放在第一个。
- 我们要用的
makefile
标签:bin,文件,Makefile,make,makefile,源文件,编译,Linux From: https://blog.csdn.net/2302_76561054/article/details/137994154bin=mycode # 定义变量 bin,其值为 mycode,表示最终生成的可执行文件名 scr=code.c # 定义变量 scr,其值为 code.c,表示要编译的 C 源文件名 $(bin):$(scr) # 定义了一个规则,目标(可执行文件)是 $(bin),依赖是 $(scr) @gcc -o $@ $^ # 使用 gcc 编译器将源代码编译为可执行文件,“$@”代表目标文件名,“$^”代表所有依赖文件 @echo "compiler $(scr) to $(bin)" # 执行完成后,输出编译信息 .PHONY:clean clean: # 定义一个名为 clean 的目标,用于清理构建生成的文件 @rm -f $(bin) # 删除 $(bin) 指定的文件 @echo "clean project..." # 执行完成后,输出清理信息
注意:
1.在Makefile
中,命令前的@
符号是可选的,他的作用是阻止make
工具在执行命令前输出该命令本身。这意味着当make
执行包含@
符号的命令时,终端只会显示命令的执行结果,而不会显示命令行命令。
2.要编译code.c
文件,你可以在命令行中运行make
。要清理生成的文件,你可以运行make clean
。
3.#
是makefile
中的注释