Makefile学习(三)[第二版]
make常用內(nèi)嵌函數(shù)
1、函數(shù)調(diào)用
???$(function?arguments) #$引用的結(jié)果就是函數(shù)生成的結(jié)果
?
2、Makefile下常用的函數(shù)
1)$(wildcard?PATTERN) #匹配當(dāng)前目錄下的文件
例如:src=$(wildcard?*.c) #匹配當(dāng)前目錄下所有的.c文件
?
2)$(patsubst?PATTERN,REPLACEMENT,TEXT) #模式替換函數(shù)
例如:$(patsubst?%.c,%.o,$src) #等價(jià)于$(src:%.c=%.o)[常用]
?
3)shell函數(shù),執(zhí)行shell命令
例如:$(shell?ls?–d?*/)
?
多級目錄Makefile
#示例1-所有的編譯均由主目錄下的Makefile完成
CC =?gcc???
CFLAGS?? =?-Wall?-g
?
BIN????? =?main??
?
SUBDIR?? =?$(shell?ls?-d?*/) #SUBDIR保存了當(dāng)前目錄下的子目錄
ROOTSRC? =?$(wildcard?*.c) #ROOTSRC保存了當(dāng)前目錄下的.c文件
ROOTOBJ? =?$(ROOTSRC:%.c=%.o) #ROOTOBJ保存了將ROOTSRC中.c替換為.o文件之后的結(jié)果
?
SUBSRC?? =?$(shell?find?$(SUBDIR)?-name?'*.c') #SUBSRC保存了所有子目錄下的所有.c文件
SUBOBJ?? =?$(SUBSRC:%.c=%.o) #SUBOBJ保存了將SUBSRC中.c替換為.o文件之后的結(jié)果
?
$(BIN):$(ROOTOBJ)?$(SUBOBJ)
????????$(CC)?$(CFLAGS)?-o?$(BIN)?$(ROOTOBJ)?$(SUBOBJ)
?
%.o:%.c
????????$(CC)?$(CFLAGS)?-c?$<?-o?$@ #將所有的.c生成.o文件
?
clean:
????????rm?-f?$(BIN)?$(ROOTOBJ)?$(SUBOBJ)
?
?
#示例2-各個(gè)子目錄下都有想對應(yīng)的Makefile文件,各個(gè)子目錄負(fù)責(zé)相應(yīng)的編譯工作
?
DIRS?=?lib?intro?sockets?advio?daemons?datafiles?db?environ?\
????fileio?filedir?ipc1?ipc2?proc?pty?relation?signals?standards?\
????stdio?termios?threadctl?threads?printer?exercises
?
all:
????for?i?in?$(DIRS);?do?\
????????(cd?$$i?&&?echo?"making?$$i"?&&?$(MAKE)?)?||?exit?1;?\
????done
?
clean:
????for?i?in?$(DIRS);?do?\
????????(cd?$$i?&&?echo?"cleaning?$$i"?&&?$(MAKE)?clean)?||?exit?1;?\
done
?
生成分布在多個(gè)目錄下的可執(zhí)行文件
#每個(gè)子目錄都需要生成一個(gè)可執(zhí)行文件,當(dāng)前目錄的結(jié)構(gòu)如下圖
#各個(gè)文件的內(nèi)容如下
?
//test1/test1.c #include <stdio.h>int main() {printf("Hello !\n");return 0; }
#test1/Makefile?
.PHONY:?all?clean?print
?
CC?=?gcc?
CFLAGS?=?-Wall?-g
?
BIN?=?test1
SOURCES?=?$(wildcard?*.c)
OBJECTS?=?$(SOURCES:%.c=%.o)
?
all:?print?$(BIN)
print:
????@echo?"-----?make?all?in?$(PWD)?-----"
?
$(BIN):?$(OBJECTS)
????$(CC)?$(CFLAGS)?-o?$@?$^
?
#$(OBJECTS):?$(SOURCES)
%.o:?%.c?
????$(CC)?$(CFLAGS)?-o?$@?-c?$<
?
clean:
????@echo?"----?make?clean?in?$(PWD)?-----"
? ? -rm?-rf?$(BIN)?$(OBJECTS)
//test2/test2.cpp #include <iostream> using namespace std;int main(void) {cout << "World!" << endl; }
#test2/Makefile
.PHONY:?clean?all?print
?
CXX?=?g++?
CPPFLAGS?=?-Wall?-g
?
BIN?=?test2
SOURCES?=?$(wildcard?*.cpp)
OBJECTS?=?$(SOURCES:.cpp=.o)
?
all:?print?$(BIN)
?
print:
????@echo?"-----?make?all?in?$(PWD)?-----"
?
$(BIN):?$(OBJECTS)
????$(CXX)?$(CPPFLAGS)?-o?$@?$<
?
%.o:?%.cpp??#可以省略該行以及下面一行
????$(CXX)?$(CPPFLAGS)?-o?$@?-c?$<
?
clean:
????@echo?"-----?make?clean?in?$(PWD)?-----"
? ? -rm?-rf?$(BIN)?$(OBJECTS)
#Makefile-在主目錄下
SUBDIR?=?$(shell?/bin/ls?-d?*/)
?
.PHONY:?default?all?clean?$(SUBDIR)
?
default:?all?
?
all?clean:
????$(MAKE)?$(SUBDIR)?TARGET=$@
?
$(SUBDIR):
? ? $(MAKE)?-C?$@?$(TARGET)
#執(zhí)行make之后的結(jié)果
?
?
#執(zhí)行后的目錄結(jié)構(gòu)圖
增添了好多文件[.o?和?可執(zhí)行文件]
?
#執(zhí)行make?clean的結(jié)果
?
?
#執(zhí)行之后的結(jié)構(gòu)圖
恢復(fù)原樣O(∩_∩)O~
總結(jié)
以上是生活随笔為你收集整理的Makefile学习(三)[第二版]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字音视频知识点汇总(二)
- 下一篇: Socket编程实践(10) --sel