您的位置:首页 > 运维架构 > Linux

linux Makefile基础知识

2015-02-05 10:31 369 查看
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 <stdio.h>

int test_fun()

{

printf("it is B\n");

return 0;

}

a.c:

#include <stdio.h>

#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, .$@.d -c -o $@ $<

clean:

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