MakeFile Implicit Rules,A Gift for Me(强大的MAKEFILE)!!!
来源:互联网 发布:戈尔鲍迪 知乎 编辑:程序博客网 时间:2024/05/23 16:19
MakeFile Implicit Rules,A Gift for Me(强大的MAKEFILE)!!!
这几天在解决源代码编译时忽然遇到个问题,今天终于在网络上学习MAKEFILE资料后得到解决,在此与大家分享。
使用GCC开发的朋友是不是会常写MakeFile呀,一般来说COPY一个已经有的MakeFile,改一改加入自己的CFLAGS和OBJECTS就好了,其中有几行处理OBJECT编译的suffix rule:
.c.o:它会根据.o目标的依赖自动找到对应的.c进行编译,所以的objects使用相同的CFLAGS,平常这没有什么问题,可是如果其中有部分objects需要使用与众不同的CFLAGS定义怎么办呢?
$(CC) -c $(CFLAGS) -o $*.o $<
.S.o:
$(CC) -c $(CFLAGS) -o $*.o $<
比如我的程序三个.c文件main.c,meth_a.c,meth_b.c,他们使用到一个DEBUG的宏来在MAKEFILE中定义用来打开debug信息,可是我现在只希望打开meth_b.c中的debug信息怎么办呢,MakeFile的隐式规则可以帮助你办到!
CFLAGS += -Wall
CFLAGS += -O2
CFLAGS += -ansi
CFLAGS += -I/usr/include
meth_b.o : CFLAGS += -DDEBUG
只要加入meth_b.o : CFLAGS += -DDEBUG就好了,它表示在编译目标时CFLAGS自动加上-DDEBUG的宏定义,厉害,强大的MakeFile!!!
以下是参考文章转载:
http://www.study-area.org/cyril/opentools/opentools/x1176.html
內隱規則(Implicit Rules)
簡介
通常我們編譯程式時有很多算是每個人都有的共同習慣,例如我就是把foo.c 編成foo.o。像這樣的編譯習慣,gnu make有一些內定規則來編譯,也就是有的target你不寫,make也可以根據內定規則把他編譯出來。不用對每個不同的.o寫不同的規則,如果有個程式由foo.c foo1.c foo2.c......寫這些就寫得會發瘋了,例如
foo.o:foo.c因此如果你不寫foo.o的規則,那麼make當別的規則用到foo.o時,他找不到規則來編,就會自動找foo.c來編譯。這樣看不到的編譯規則有很多,如
gcc -c -o foo.o foo.c
foo1.o:foo1.c
gcc -c -o foo1.o foo1.c
....
C程式
$(CC) -c $(CPPFLAGS) $(CFLAGS) xxx.c來編譯
或者找不到.c時會去找.cc, .cpp, .C檔
C++程式
$(CXX) -c $(CPPFLAGS) xxx.cpp
TeX
xxx.dvi 由xxx.tex產生
Pascal
$(PC) -c $(PFLAGS) xxx.p
自己的內隱規則
因為可能有的時候你希望做些dependency檢查,或者加上一些gcc用的旗標,不是很單純的編譯而已你可以給make自訂的內隱規則
- 樣式規則(pattern rule)
你可以用pattern rule來做一些自定的內隱規則。像這樣
%.o : %.c prog.h
或者
$(CC) $(CFLAGS) $(DEBUG_FLAG) -c -o $@ $<
%.pdf : %.sgml
%表示所有相對於後面先決條件的檔名的意思,他不是*,因為他 有一對一的相對應關係,foo.o 就要找foo.c,foo1.o就要找foo1.c, 所以他不是*。所以上面的意思是所有碰到要.o的target時,去找相 對應的.c檔,並根據先決條件prog.h做檢查,如果找不到prog.h就不 做下去了。%不只可以表現主檔名,其實可以表現任一個相對應的字串, 所以叫pattern,你可以用s.%.c,不只用&.c,其中對應到%的子字 串叫stem。另外$@ $<...這種符號,叫自動變數,請往後翻一下, 看一下解說。
db2pdf $<
pattern rule也可以有特定變數設值,特定樣式(pattern)的變數,例如
%.o : CFLAGS = -O
表示只要有要編譯xxxx.o的規則時,通通要設CFLAGS為-O。
- 副檔名規則
還有更古老的一種叫suffix rule的方法來做,這種方法就有限制性 了,因為只能用在副檔名的規則。例如
.c.o:
小心喔,跟%o : %c順序不一樣喔
$(CC) -c -o $*.o $<
.S.o:
$(CC) -c -o $*.o $<
自訂規則
自動變數與內隱規則
因為這樣動態的編譯手法,它需要像在CVS裡面的%v %V %s這種東西來代替一些動態改變的字串(幫你複習一下CVS)。所以有所謂的自動變數
$@同一個規則的目標名上面是比較常用的
$*這個只有在內隱規則中有用。表示樣式或副檔名規則中對應到的字串。
$<同一規則的第一個先決條件名,這個大部分用在suffix rule,因為
suffix rule只有一個檔。
$?同一個規則的所有先決條件名,但是只有原始程式碼改過的比obj檔新才會
符合,也就是比target還新的先決條件檔案。
$^ 所有先決條件,但是有的make像solaris make可能不認得這個自動變數。
內隱規則內也預設了一些變數,例如
AR = ar如果你沒有設CC這個變數,則自動是cc這個值,可以直接拿$(CC)來用。自定內隱規則可以寫在任何地方,make會自動先找到他們,等到要用時就會去用。通常在一些系統上例如Solaris, AIX...已經有Sun IBM的make了,所以系統管理者通常會把GNU make叫gmake,這時可以設MAKE = gmake。
CC = cc
MAKE = make
CXX = g++
- MakeFile Implicit Rules,A Gift for Me(强大的MAKEFILE)!!!
- Makefile Implicit Rules
- Makefile:1279: *** mixed implicit and normal rules.
- Makefile:1279: *** mixed implicit and normal rules.
- 解决: busybox-1.16.1的 Makefile:431: *** mixed implicit and normal rules. Stop. 问题
- MakeFile _10.3 Variables Used by Implicit Rules
- Makefile:431: *** mixed implicit and normal rules. Stop.
- Makefile:431: *** mixed implicit and normal rules. Stop.
- 配置内核 Makefile:1449: *** mixed implicit and normal rules. Stop.
- 配置内核 Makefile:1449: *** mixed implicit and normal rules. Stop.
- Makefile:431: *** mixed implicit and normal rules. Stop.
- 配置内核 Makefile:1449: *** mixed implicit and normal rules. Stop.
- Error:Makefile:1449:*** mixed implicit and normal rules: deprecated syntax
- Makefile:1607 *** mixed implicit and nomal rules:depracated syntax
- Error:Makefile:1449:*** mixed implicit and normal rules: deprecated syntax
- 配置内核 Makefile:1449: *** mixed implicit and normal rules. Stop.
- A tutorial for Makefile
- 关于makefile的rules.mk 解读
- 开源的HIDS软件
- sqlserver数据库索引深解
- 简单入门正则表达式 - 第三章 快速入门
- 杨致远最新电话访谈录
- 马云不得不听的一些话【实用】
- MakeFile Implicit Rules,A Gift for Me(强大的MAKEFILE)!!!
- Debian GNU Linux 4.0 r5 发布
- 无意看到的一篇文章,有我的影子
- web服务器和应用服务器的区别
- 银光团队项目正式启动,欢迎您的参与!
- PetShop数据库解读
- 大连等八城市签署信息产业区域合作协议
- Myspace中国大股东证实:罗川仍在"全职工作"
- 《新闻周刊》:为什么杨致远还在领导雅虎?