日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Makefile学习(三)[第二版]

發(fā)布時(shí)間:2025/3/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Makefile学习(三)[第二版] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。