Makefile-自动依赖

Makefile生成自动依赖的方法有两种:

1.  将所有.o文件的依赖关系写入单独文件,然后在Makefile中调用该文件

2.  每个.c文件对应一个.d文件,将依赖关系写入.d文件中

一、对于第一种方法,Makefile的写法如下:

#file start

CC = gcc

SRCS := $(wildcard *.c)

OBJS := $(patsubst %.c,%.o, $(SRCS))

all: main

main: $(OBJS)

$(CC) -o main $(OBJS)

.depend: $(SRCS)

@$(CC) -MM $(SRCS) > [email protected]

sinclude .depend

clean:

rm -f  *.o .depend main

#file end

说明:

(1)       OBJS := $(patsubst %.c,%.o, $(SRCS))

将$(SRC)中的.c文件列表替换成对应的.o文件,在这里不能用“*.c”“*.o”来代替,试想在.o文件还不存在的情况下,规则语句“main: $(OBJS)”就会被解析成“main:*.o”,main依赖于“*.o”,“*.o”对应的规则又去哪找呢

(2)       .depend: $(SRCS)

为的是.c文件更改时重新生成.depend文件

(3)       @$(CC) -MM $(SRCS) > [email protected]

行首的”@”符号表示在执行make时不显示该符号后的shell命令;

[email protected]:表示当前目标文件,即”.depend”

假设main.c文件只引用了main.h头文件,那么这条命令的输出结果为:

main.o: main.c main.h

(4)       sinclude .depend

将生成的依赖关系文件引入到当前Makefile。

Makefile中include的调用方式:

a)  首先在指定的目录下搜索被调用文件(该例没有加路径,则为当前目录)

b)  如果没有找到,则从-I所指定的include目录查找,如果还没找到,则从“/usr/gnu/include”“/usr/local/include”等目录查找

c)  最终结果还是没找到,则Makefile会试图寻找匹配规则来生成对应文件,例如本例中的规则为:

.depend: $(SRCS)

@$(CC) -MM $(SRCS) > [email protected]

则根据该规则生成.depend文件。

程序首次编译时肯定不存在.depend文件,但这是makefile也不需要该文件,因为首次编译肯定连接的都是最新文件。也就是说首次编译时生成的.depend文件其实没用上,而是留作以后有了改动,比如更改了.h文件中的宏变量,则此时可根据.depend中的依赖关系只生成对应的.o文件了

d)  如果没有对应规则或其它原因导致生成文件失败,就要看你用的是include还是sinclude了,两者的区别:


 

异常


错误


include


输出异常信息(例如首次编译时找不到.depend文件)


Makefile终止执行(例如找不到匹配规则而无法生成文件)


cinclude


不输出异常信息


忽略该错误,makefile继续执行

(5)      此方法过时?

     很遗憾,在<< GNU make>>手册中说该方法过时了,原因描述如下:

InGNU make, the feature of remaking makefiles makes this practice obsolete—you need nevertell make explicitly to regenerate the prerequisites, because it always regenerates any makefile that is out of date.

这段话的关键句“because it always regenerates any makefile that is out of date”甚是无法理解,要的不就是这种效果么,有文件更新的话对其进行重新编译,对的啊,不懂!

正是由于这个搞不懂的原因才有了第二种方法

二、为每个.c文件生成对应的.d文件,Makefile写法如下:

#file start

SOURCES = $(wildcard *.c)

OBJS := $(patsubst %.c,%.o, $(SOURCES))

all: main

%.d: %.c

@set -e; rm -f [email protected]; /

$(CC) -MM  $< > [email protected]

; /

sed ‘s,/($*/)/.o[ :]*,/1.o [email protected] : ,g‘ < [email protected]

> [email protected]; /

rm -f [email protected]

sinclude $(SOURCES:.c=.d)

main:$(OBJS)

$(CC) -o main $(OBJS)

clean:

rm -f *.o test *.d

#file end

上面提到的原因中“you need nevertell make explicitly to regenerate the prerequisites”,其实在这里也是手动指定的啊:“$(CC) -MM  $< > [email protected]

”,另外为每个.c文件都生成.d文件似乎还麻烦了些,没明白手册是什么意思。

贴上main.d文件中的内容:

main.o main.d : main.c main.h

时间: 2024-08-09 05:45:43

Makefile-自动依赖的相关文章

Makefile自动依赖所有需要的头文件

最近由于项目的一些变化,需要摒弃掉用IDE编译的方式,改为使用Makefile手动编译.我又拾起了多年不碰的Makefile,虽然很多关键字不记得叫什么名字了,自己的文章也没有记录,好在网上还有很多同学都有记录的习惯,一搜索就能找到,倒也还好,只是有一个问题,折腾了好些时间,就是怎么处理自动依赖. 我对完成这件事情有两个要求 一是生成的.d .o文件必须独立存放,不要放在.c源文件的目录下,以免污染了source目录. 二是.c会include的所有.h文件,如果有更新,此.c也必须要重新编译.

(转)makefile中的自动依赖规则

Makefile生成自动依赖的方法有两种: 1.  将所有.o文件的依赖关系写入单独文件,然后在Makefile中调用该文件 2.  每个.c文件对应一个.d文件,将依赖关系写入.d文件中 一.对于第一种方法,Makefile的写法如下: #file start CC = gcc SRCS := $(wildcard *.c) OBJS := $(patsubst %.c,%.o, $(SRCS)) all: main main: $(OBJS) $(CC) -o main $(OBJS) .d

Makefile自动生成头文件依赖

前言 Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖. CC = gcc CFLAGS = -Wall -O INCLUDEFLAGS = LDFLAGS = OBJS = seq.o TARGETS = test_seq .PHONY:all all : $(TARGETS) test_seq:test_seq.o $(OBJS) $(CC) -o

Makefile自动生成工具-----autotools的使用(详细)

相信每个学习Linux的人都知道Makefile,这是一个很有用的东西,但是编写它是比较复杂,今天介绍一个它的自动生成工具,autotools的使用.很多GNULinux的的软件都是用它生成Makefile的,包括我们非常熟悉的Linux内核源代码. 1.准备: 需要工具 autoscan aclocal autoheader automake autoconf auto make 在终端敲入命令,哪个没有安装哪个,一般是第一个autoscan没有,其它的我用的Ubuntu10.04下全部都有

Makefile 自动生成头文件的依赖关系 .

最近在看一本书<Windows游戏编程大师技巧> (Tricks of Windows Game Programming Gurus). 第一章给出了一个打砖块小游戏的示例程序. 包括三个文件: blackbox.h, blackbox.cpp和freakout.cpp (600行代码, 对于Windows C++程序来说还好, 没有让我freak out…). blackbox.cpp封装了部分DirectDraw, 提供了一些更傻瓜化的初始化DirectDraw, 画点, 画方框的工具函数

Makefile 自动产生依赖

代码如下: makefile 代码: 1 %.d: %.c 2         $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \ 3         sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; \ 4         rm -f [email protected]$$$$ 其实这里主要

makefile自动生成目标与依赖的关系

有main.c: 1 #include <stdio.h> 2 #include "command.h" 3 4 int main(int argc, const char *argv[]) 5 { 6 printf("run in main\n"); 7 return 0; 8 } commad.h: 1 #ifndef __COMMAND_H__ 2 #define __COMMAND_H__ 3 4 #define PI 3.14159 5 6 #

makefile自动生成依赖关系 可自动检测头文件变化

DEBUG=1 CC = gcc CXX=g++ ifeq ($(DEBUG), 1) OPTS=-O0 -g -DDEBUG endif CFLAGS = -fPIC   -I$(COMPILE_DIR) -I$(vesdkdev)  -I$(es_common) -I$(vesdk) -I$(vesdk)/boost-153/include -I$(vesdkproject) CXXFLAGS=$(CFLAGS) Target = libServerCfg.so VPATH = src OB

linux makefile自动生成

一.Linux Makefile介绍 Linux Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Linux Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件. Linux Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件.当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块. Linux Makefile的

C/C++ makefile自动生成工具(comake2,autotools,linux),希望能为开源做点微薄的贡献!

序 在linux下C或C++项目开发,Makefile是必备的力气,但是发现手写很麻烦. 在百度有个comake2工具,用于自动生成Makefile工具,而在外边本想找一个同类工具,但发现很难做到,只发现有个类似的智能生成工具autotools,但是操作比较麻烦,奔着“一人学习,大家共享”的原则,手动写了一个工具类,帮助自己和大家生成现成的c或者cpp框架. 代码比较简单,希望我们能一起改善下. git路径:https://github.com/chuanshanjia/ccpp/blob/ma