1、MAKEFILE入门入门提纲提纲 什么是makefile 分析一个简单的makefile Makefile中经常用到的知识 我们常用的makefile是如何组成的 什么是makefile 程序的基本编译过程 makefile的作用分析一个简单的makefileMakefile中经常用到的知识我们常用的makefile是如何组成的程序的基本编译过程程序的基本编译过程 基本编译过程:源文件目标文件(.o)链接成一个可执行程序(elf) 在linux下的实现:1、编写源文件2、使用g+来进行编译:a)如果只有一个文件(c/cpp文件),直接可以编译:g+ helloworld.cpp -o hell
2、oworldb)如果需要多个文件链接,则先编译成.o文件,再进行链接g+ -c a.cpp -o a.o g+ -c b.cpp -o b.og+ a.o b.o -o exefile 每次编译都要敲那么多命令,很麻烦,所以将这些命令写到makefile里。Make命令会去读makefile,然后自动去执行所有的编译过程,并将结果返回。 在大型的项目中,源文件的组成是很复杂的,所以需要makefile来多整个项目进行编译。 Linux有各种各样的发行版本,有些库并不通用,所以会使用automake的一系列工具来检查当前的系统是否可以对该项目进行编译。Makefile的作用的作用什么是makef
3、ile 分析一个简单的makefile makefile的基本结构 helloworld的makefileMakefile中经常用到的知识我们常用的makefile是如何组成的target : prerequisites command Target通常称作目标目标。它是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。 Prerequisites通常称作依赖依赖。就是要生成那个target所依赖的文件或是目标。 command也就是make需要执行的命令。(任意的Shell命令,前面一定是一个前面一定是一个tab键键)Makefile的基本结构的基
4、本结构target : prerequisites command这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是:prerequisites中如果有文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。Makefile的基本结构的基本结构target : prerequisites command注意:Command前是一个tab键helloworld: hello.cppg+ hello.cpp -o
5、 hellowdhelloworld的的makefile什么是makefile分析一个简单的makefile Makefile中经常用到的知识容易忽略的问题 伪目标隐式规则我们常用的makefile是如何组成的 包含库的时候要去掉lib前缀。如要包含libcomm,则需要这样来写:-L$(PATH)/lib lcomm 如果是只编译不链接,请注意要加参数-c target . : prerequisites .command中的command可以是任意的shell命令。但在Makefile中的命令,必须要以Tab键开始。 在编写makefile中请记住环境变量的存在。可以使用env命令来显示当
6、前环境变量的值。容易忽略的问题容易忽略的问题 经常见到的make clean其实是通过makefile中的一个clean目标实现的。 但如果源文件中有一个clean的代码文件,就一定会真存在一个clean目标,这样就和清除命令混在一起了。 为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。如:.PHONY: clean clean: rm *.o temp 伪目标伪目标 看如下的一个编译规则:%.o : %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $ -
7、o $%.o(目标,(目标,target) : %.c(依赖,(依赖, prerequisites ) 是表示把所有的.c文件都编译成.o文件;$ 是每次匹配到的那个依赖文件$ 是每次匹配到的那个目标文件隐式规则隐式规则什么是makefile分析一个简单的makefileMakefile中经常用到的知识 我们常用的makefile是如何组成的 m:通用库调用路径 makefile:编译使用的文件 “-I” :定义了你自己的头文件的存储目录。 “-L”:定义了你自己的库文件存放目录。 Make中可以定义变量,直接赋值就可以了:ARPS_ROOT = /home/yedeng/arps 引用变量使
8、用$(APRS_ROOT),make会自动进行替换。将$(APRS_ROOT)用“/home/yedeng/arps”来代替。实际看我们用的一个m:打开文件m:通用库调用路径:通用库调用路径 在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。 Makefile中还可以使用一些函数: $(patsubst ,) :模式字符串替换函数。功能:查找中的单词是否符合模式,如果匹配的话,则以替换。 $(wildcard PATTERN.) :保持通配符有效。功能:在规则中,通配符会被自动展开。但在
9、变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”。makefile:编译使用的文件一:编译使用的文件一 :=和=的区别:AAA=abcd BBB=$(AAA) CCC:=$(AAA) AAA=cdef 此时,(BBB) 为 cdef (跟随AAA变化)。$(CCC) 为 abcd(不随AAA变化)。 在Makefile还可以使用shell命令:CurrDir := $(shell basename pwd) 分析我们现在使用的一个makefile:打开文件makefile:编译使用的文件二:编译使用的文件二提纲提纲 什么是makefile
10、分析一个简单的makefile Makefile中经常用到的知识 我们常用的makefile是如何组成的 什么是makefile 程序的基本编译过程 makefile的作用分析一个简单的makefileMakefile中经常用到的知识我们常用的makefile是如何组成的什么是makefile 分析一个简单的makefile makefile的基本结构 helloworld的makefileMakefile中经常用到的知识我们常用的makefile是如何组成的什么是makefile分析一个简单的makefile Makefile中经常用到的知识容易忽略的问题 伪目标隐式规则我们常用的makefile是如何组成的什么是makefile分析一个简单的makefileMakefile中经常用到的知识 我们常用的makefile是如何组成的 m:通用库调用路径 makefile:编译使用的文件Q&A谢谢!谢谢!