linux Makefile基础知识

1、编译流程:预处理、编译、汇编、链接。很多情况下,编译包含了预处理、编译和汇编这三步。

2、Makefile的核心:规则

目标:依赖

[tab]命令

命令被执行的条件:(1)没有目标  (2)依赖文件比目标文件新

3、Makefile的变量赋值

Makefile中变量赋值有两种方式:延时变量和立即变量。延时变量就是在使用到的时候才扩展,立即变量是在定义时就已经确定。

变量的定义语法形式如下:

immediate = deferred

immediate := immediate

4、Makefile函数

函数调用的格式如下:

$(function arguments)

函数名和参数之间用空格或者Tab隔开,如果有多个参数,它们之间用逗号隔开。这些空格和逗号不是参数值的一部分。

例如:

$(patsubst pattern,replacement,text)  //寻找text中符合格式"pattern"的字,用"replacement"替换它们。

实例:

$(patsubst %.c,%.o,x.c.c bar.c)

结果为:x.c.o bar.o

5、各类Makefile的分析比较:

假如有如下三个文件:a.h a.c b.c

a.h:

#define A 1

b.c:

#include
int test_fun()

printf("it is B\n");
return 0;

a.c:

#include
#include "a.h"
int main()
{
printf("hello, world!\n");
printf("A= %d\n", A);
test_fun();
return 0;
}

第一种Makefile:

test: a.c b.c a.h

gcc -o test a.c b.c

缺点:每修改一个文件,全部文件都会被重新编译,再链接

第二种Makefile:

test: a.o b.o

gcc -o test a.o b.o

a.o: a.c

gcc -c -o a.o a.c

b.o: b.c

gcc -c -o b.o b.c

缺点:(1)如果依赖的文件比较多,则需要为每一条依赖分配一条规则  (2)如果头文件修改了不会引起编译

第三种Makefile:

test: a.o b.o

gcc -o test a.o b.o

a.o: a.c a.h

%.o: %.c

gcc -c -o $@ $<

缺点:每编译一个文件,都得把依赖文件在后面声明,太繁琐

第四种Makefile:

objs := a.o b.o

test: $(objs)

gcc -o $@ $^

dep_files := (foreach f $(objs) $(f).d)

dep_files := wildcard $(dep_files)

ifneq ($(dep_files), )

include $(dep_files)

endif

%.o:%.c

gcc -Wp,-MD, [email protected] -c -o $@ $<

clean:

rm *.o test *.d

你可能感兴趣的:(Linux基础)