make在执行时,需要一个命名为Makefile的文件。这个文件告诉make以何种方式编译源代码和链接程序。make通过比较对应文件(规则的目标和依赖,)的最后修改时间,来决定哪些文件需要更新、那些文件不需要更新。对需要更新的文件make就执行相应命令来重建它,对于不需要重建的文件make什么也不做。
1、放在/lib 、/usr/lib 和 /usr/local/lib中的库直接用 -l 链接。如果没有要链接的库不在这三个目录中,那么使用-L + 库文件所在的目录 + -l库名
库名和库文件名是有差别的:例如/mylib下有一个库文件libchart.so那么他的库名就是chart链接库的时候这么写: -L /mylib -lchart
2、-I用来包含头文件(如果/usr/include目录中就不用指定),如果头文件放到/myinclude中,要这么包含:-I /myinclude用来告诉编译器到这儿找头文件
Mkefile规则介绍
一个简单的Makefile描述规则组成:
TARGET... : PREREQUISITES...
COMMAND
...
...
target:规则的目标。通常是最后需要生成的文件名或者为了实现这个目的而必需的中间过程文件名。可以是.o文件、也可以是最后的可执行程序的文件名等。另外,目标也可以是一个make执行的动作的名称,如目标“clean”,我们称这样的目标是“伪目标”。
prerequisites:规则的依赖。生成规则目标所需要的文件名列表。
command:规则的命令行。是规则所要执行的动作(任意的shell命令或者是可在shell下执行的程序)。它限定了make执行这条规则时所需要的动作。
一个规则可以有多个命令行,每一条命令占一行。注意:每一个命令行必须以[Tab]字符开始,[Tab]字符告诉make此行是一个命令行。make按照命令完成相应的动作。这也是书写Makefile中容易产生,而且比较隐蔽的错误。
命令就是在任何一个目标的依赖文件发生变化后重建目标的动作描述。一个目标可以没有依赖而只有动作(指定的命令)。比如Makefile中的目标“clean”,此目标没有依赖,只有命令。它所定义的命令用来删除make过程产生的中间文件(进行清理工作)。目标“clean”不是一个文件,它仅仅代表执行一个动作的标识。正常情况下,不需要执行这个规则所定义的动作,因此目标“clean”没有出现在其它任何规则的依赖列表中。因此在执行make时,它所指定的动作不会被执行。除非在执行make时明确地指定它。而且目标“clean”没有任何依赖文件,它只有一个目的,就是通过这个目标名来执行它所定义的命令。Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”(phonytargets)。需要执行“clean”目标所定义的命令,可在shell下输入:make clean。
在实际应用时,我们把这个规则写成如下稍微复杂一些的样子。以防止出现始料未及的情况。
.PHONY : clean
clean :
-rm edit $(objects)
这两个实现有两点不同:1.通过“.PHONY”特殊目标将“clean”目标声明为伪目标。避免当磁盘上存在一个名为“clean”文件时,目标“clean”所在规则的命令无法执行。
变量:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
…….
…….
clean :
rm edit $(objects)
自动推导规则:
make存在一个默认的规则,能够自动完成对.c文件的编译并生成对应的.o文件,对于一个.c文件如果使用make的隐含规则,那么它会被自动作为对应.o文件的一个依赖文件因此我们也可以在规则中省略目标的倚赖.c文件。 例如:
main.o:main.c zlm.h
gcc -c main.c
就可以写成这样:
main.o:zlm.h
通配符:
Makefile中统配符可以出现在以下两种场合:
1. 可以用在规则的目标、依赖中,此时make会自动将其展开;
2. 可出现在规则的命令中,其展开是在shell在执行此命令时完成。
如果 Makefile 有这样一句:“ objects = *.o ”。那么变量“ objects ”的值就是“ *.o ”,而不是使用空格分开的所有 .o 文件列表。如果需要变量“ objects ”代表所有的 .o 文件,则需要是用函数“ wildcard ”来实现( objects = $(wildcar *.o) )。可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。这样我们就可以得到在当前目录可生成的.o文件列表。