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
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
相关文章推荐
- Linux的make与makefile的基础知识
- Linux下C语言编程基础知识--gcc编译器的使用、MakeFile文件的编写
- Linux makefile基础知识
- Linux基础知识99问(二)
- Linux基础知识99问(四)
- Linux基础知识
- [基础知识]Linux新手系列之五
- Linux基础知识99问(三)
- Linux下C语言编程--基础知识
- (转贴)Linux基础知识(4)
- Linux基础知识(3)
- linux0.11缓冲处理过程及一点块设备的基础知识
- Linux基础知识99问(一)
- linux基础之Makefile
- 掌握“神兵利器”--linux基础知识99问(转)
- 1)Linux程序设计入门--基础知识
- linux驱动开发的基础知识
- Linux 硬件管理的基础知识
- Linux基础知识99问(一)
- Linux下C语言编程--基础知识