vimer linux kernel 爱好者

Makefile简介

2014-12-07

简介

在linux下编程,最熟悉的不过是Makefile了。这个文件是用于自动连接和编译的,而且记录所有工程文件的修改信息,这样,这个工程在下次编译前会自动重新编译。

特殊变量

$@ 目标文件

对应于target,”@” 是”argument”的简写。当你键入make foo的时候,”foo” 就是 argument,也就是@#(?).

$^ 所有依赖文件

与”$<”相类似,只不过它表示所有的的依赖的文件”^”记住嘛。

$< 第一个依赖文件

在依赖条件列表中的第一个输入文件。帮助记忆,”<”在shell中,这就是输入的”<”.

$?

所有的比target新的依赖文件(input),”你在干什么,哪些文件必须改变?”

%

%的作用类似于”*“在shell的作用,也就是任意匹配

以上会衍生出$(@D) $(@F),也就是目录和文件的区别

	main: main.o mytool1.o mytool2.o
		gcc -o $@ $^
	main.o: main.c mytool1.h mytool2.h
		gcc -c $< # -c 只输出目标文件,不产生可执行文件
	mytool1.o: mytool1.c mytool1.h
		gcc -c $<

缺省规则

	.c.o:
		gcc -c $<

这个规则表示所有的 .o文件都是依赖对应的.c文件的,简化以后的Makefile

	main: main.o mytool1.o mytool2.o
		gcc -o $@ $^
	.c.o:
		gcc -c $<

函数

Makefile中有很多的函数,这里,将碰到的一一记录下来,做个完善。

wildcard

这个函数拾取特定目录下的文件通配符.比如我要将一个头文件.h三个源文件.c编译成 一个目标文件,那么,我就可以首先声明一个变量SRCS,然后将所有的源文件(包括头 文件)一起赋给它.

SRCS = $(wildcard *.c)

这样,变量SRCS就包括所有的源文件了

update 高级一点的用法,

$(patsubst %.c,%.o,$(wildcard))

这句话将所有文件名的后缀.c替换成.o,这样我们就可以得到当前目录下生成的可执行 文件。


下一篇 linux中的段

Comments

Content