您的位置:首页 > 其它

makefile 学习的点滴总结-(2)

2013-11-26 10:17 363 查看
目录

1、=和:=的区别

2、Makefile $@, $^, $<

3、“order-only”依赖 “|”的用法

4、wildcard使用

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

1、=和:=的区别。

  (1)“=”

make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

x = foo
y = $(x) bar
x = xyz

在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

(2)“:=”

“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

x := foo
y := $(x) bar
x := xyz

在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2、Makefile $@, $^, $<
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表

如一个目录下有如下文件:

$ ls
hello.c hi.c main.c Makefile

按照 Makefile 规则规规矩矩的写:

main: main.o hello.o hi.o
gcc -o main main.o hello.o hi.o

main.o: main.c
cc -c main.c

hello.o: hello.c
cc -c hello.c

hi.o: hi.c
cc -c hi.c

clean:
rm *.o
rm main

改为用上述符号进行替代:

main: main.o hello.o hi.o
gcc -o $@ $^
main.o: main.c
cc -c $<
hello.o: hello.c
cc -c $<
hi.o: hi.c
cc -c $<
clean:
rm *.o
rm main

beyes@debian:~/makefile_test/semicolon/real$ make
cc -c main.c
cc -c hello.c
cc -c hi.c
gcc -o main main.o hello.o hi.o
beyes@debian:~/makefile_test/semicolon/real$ ls
hello.c hello.o hi.c hi.o main main.c main.o Makefile

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

3、“order-only”依赖的使用举例:
   LIBS = libtest.a
    foo : foo.c | $(LIBS)
     $(CC) $(CFLAGS) $< -o $@ $(LIBS)
make在执行这个规则时,如果目标文件“foo ”已经存在。当“foo.c”被修改以后,目标“foo ”
将会被重建,但是当“libtest.a ”被修改以后。将不执行规则的命令来重建目标“foo ”。
就是说,规则中依赖文件$(LIBS)只有在目标文件不存在的情况下,才会参与规则的执行。当目
标文件存在时此依赖不会参与规则的执行过程。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

4、wildcard使用

在 Makefile 有这样一个变量定义:“objects = *.o ”。它表示变量“objects”的值是字符串“*.o”(并不是期
望的空格分开的.o 文件列表)。

当需要变量“objects”代表所有.o 文件列表示,需要使
用函数“wildcard”

objects = $(wildcar *.o)

例1:

objects = *.o
foo : $(objects)
cc -o foo $(CFLAGS) $(objects)

如果工作目录下有".o"文件,则"foo"会按照规则进行重建。

但是,如果工作目录下没有".o"文件,在执行make的时候就会报错,这时就需要将变量用wildcard来定义:

objects = $(wildcar *.o)

###############################################################

例2:

“$(patsubst %.c,%.o,$(wildcard *.c))”

表示使用“wildcard”函数获取工作目录下的.c 文件列表;之后将列表中所有文件名的后缀.c 替换为.o

#sample Makefile
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
  cc -o foo $(objects)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: