GNU中的Makefile

原创 2005年02月27日 01:28:00
来源:LinuxEden
 
在开发大系统时,经常要将程序划分为许多模块.各个模块之间存在着各种各样的依赖关系,在 UNIX 中通常使用 Makefile来管理 .Makefile其实很复杂,我向大家推荐由Stallman写的手册,那里有最详尽的描述.这里只想说一些最常用的功能.

先举一个例子:
有a.c b.c两个程序.
a.c
extern void p(char *);
main()
{
p("hello world");
}

b.c
#include
void p(char *str)
{
printf("%sn",str);
}

Makefile
hello:a.c b.c
gcc a.c b.c -o hello
----
这里是一个Tab(注意一定要有一个Tab)

执行make
gcc a.c b.c -o hello
产生一个叫hello的可执行程序.

Makefile时由规则来组成的,每一条规则都有三部分组成:目标(object),依赖(dependency)和命令(command).在上面的例子中, Makefile只有一条规则,其目标为hello,期依赖为a.c b.c,其命令为gcc a.c b.c -o hello.

依赖可以是另一条规则的目标,也可以是文件.每一条规则被这样处理.如目标是一个文件是:当它的依赖是文件时,如果依赖的时间比目标要新, 则运行规则所包含的命令来更新目标; 如果依赖是另一个目标则用同样的方法先来处理这个目标.如目标不是一个存在的文件时,则一定执行.

例如:
Makefile
hello:a.c b.o
gcc a.c b.o -o hello
b.o:b.c
gcc b.c -c

当运行 make时,可以接一目标名作为参数,表示要处理改目标.如没有参数,则处理第一个目标.对上一个例子执行 make ,则是处理hello这个目标. hello依赖于文件a.c和另一个目标 b.o,则先去处理b.o,调用gcc b.c -c来更新b.o,之后返回,调用gcc a.c b.o -o hello 来更新hello.

定义变量:
在makefile中可以定义自己的变量,例如:
CC = gcc
hello:a.c b.c
$(CC) a.c b.c

特殊变量:
$@ 目标的名字
$< 第一个依赖的名字
$^ 所有的依赖
$? 依赖中所有新于目标的

缺省规则:
make自己有一些缺省的方法来处理它遇到的文件.
如:
makefile
hello:a.o b.o
gcc a.o b.o -o hello

make
gcc a.c -o a.o
gcc b.c -o b.o
gcc a.o b.o -o hello
make自动去调用gcc来编译产生a.o和b.o.

可是问题在于我们经常要改变缺省规则,如在开发时我们希望加上参数 -g 来加上调试信息.用下面的方法来完成这一需要:
%.o:%.c
gcc -c $< -g -o $@
其中的%是通配符.

伪目标:
.PHONY:target
伪目标的命令一定会被执行.
例如
clean:
rm a.o b.o
clean的目的很简单,就是要删除所有的.o的文件.但这样写,如果处在着一个名为clean的文件时就会产生问题.加上下面一行:
.PHONY:clean
使make知道这是一个伪目标就可以了.

设置搜索路径
例如:
~/program/a.c
~/program/include/a.h

makefile
vpath %.h include
a.c:a.h

make首先在本目录下寻找, 然后在vpath指定的目录下找.本例中,
以 .h 位扩展名的文件会在~/program/include/下寻找.

一个稍稍复杂的例子:
a.h a.c
b.h b.c

makefile

OBJECTS = a.o b.o
#使用的编译器
CC = gcc
#所需的参数
FLAGS = -g
#要连接的库
LIB = -lcrypt

a.c:a.h
b.c:b.h
# .o 的文件会自动依赖于 .c 的文件.
%.o:%.c
gcc -c $< -o $@ $(FLAGS) $(LIB)
all:$(OBJECTS)
gcc $(OBJECTS) -o hello

.PHONY:clean
clean:
rm $(OBJECTS)

当你执行make时,首先,make去找GNUmakefile如没有找makefile, 最后找 Makefile. 但出于兼容性的考虑和醒目的原因, 一般使用Makefile.也可以用 -f filename 来特殊指定.

make的一些常用的参数:
-k 忽略错误,继续运行.
-C dir 在dir下进行.

《GNU make项目管理》笔记--简单的makefile

make定义了一种语言,可用来描述源文件、中间文件以及可执行文件之间的关系。它还提供了一些功能,可用来管理各种 候选配置、实现可重用程序库的细节以及让用户自定义宏将过程参数化。简言之,make常被视为...
  • TODD911
  • TODD911
  • 2015年01月15日 21:56
  • 1788

Linux编程——makefile编写技巧大全

1. Makefile 简介 本来想自己写一些makefile的东西,但是在网上查资料时发现这篇文章,感觉写得很详细,排版也很不错,现转载过来。特此声明。 原文地址:http://www.c...
  • bad_good_man
  • bad_good_man
  • 2015年11月24日 14:47
  • 4144

我所认识的GNU make(5) -- make是如何处理Makefile的

通常情况下Makefile的内容就是告诉make如何去编译和链接生成一个程序。并且默认情况下,make会以在Makefile中寻找到的目标作为这次执行make程序的最终目标,所以和最终目标不相干的规则...
  • Hydrazine
  • Hydrazine
  • 2015年01月11日 13:57
  • 764

GNUMakefiles之Makefiles变量的使用

参考文献:The GNU Make Manual v0.70(可从http://download.csdn.net/detail/npy_lp/7544225 上下载)   因为Makefile文...
  • npy_lp
  • npy_lp
  • 2014年09月08日 04:36
  • 3005

GNU开发环境基础,gcc,gdb,makefile, init启动过程

2. Makefile 编写  实例源文件 test1.c #include int main() { func1(); func2(); return 0; }func1.c #i...
  • xj626852095
  • xj626852095
  • 2014年07月16日 15:40
  • 602

Makefile中include、-include、sinclude的区别 <一>

如果指示符“include”指定的文件不是以斜线开始(绝对路径,如/usr/src/Makefile...),而且当前目录下也不存在此文件;make将根据文件名试图在以下几个目录下查找:首先,查找使用...
  • IOT_AI
  • IOT_AI
  • 2017年03月29日 09:31
  • 293

Makefile 中会在多处地方看到 FORCE

在内核的 Makefile 中会在多处地方看到 FORCE ,比如: # vmlinux image - including updated kernel symbols vmlinux: $(v...
  • wzw88486969
  • wzw88486969
  • 2013年09月16日 16:40
  • 6187

GNU makefile入门

最近在学makefile,顺便写点学习体会,兴许后来的某一天我忘了,回来翻翻博客还能找点思路。 本文仅基于GCC讲解,至于其他编译器暂时不会涉及,如果没听过啥事GCC就不要往下看了。 简单介绍一下ma...
  • ma57457
  • ma57457
  • 2017年05月25日 00:02
  • 306

Makefile命令中的@和-符号

Makefile命令中的@和-符号   如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果; Android中会定义某个变量等于@,例如 hide:= @   通常ma...
  • ncepu307
  • ncepu307
  • 2014年03月24日 15:16
  • 982

Windows环境的GNU安装以及使用makefile编译生成*.exe

Windows安装GNU编译器使用makefile
  • mimica
  • mimica
  • 2017年10月23日 12:53
  • 153
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GNU中的Makefile
举报原因:
原因补充:

(最多只允许输入30个字)