Makefile學習(三)[第二版],makefile學習第二版

來源:互聯網
上載者:User

Makefile學習(三)[第二版],makefile學習第二版
make常用內嵌函數

1、函數調用

   $(function arguments)#$引用的結果就是函數產生的結果

 

2、Makefile下常用的函數

1)$(wildcard PATTERN)#匹配目前的目錄下的檔案

例如:src=$(wildcard *.c)#匹配目前的目錄下所有的.c檔案

 

2)$(patsubst PATTERN,REPLACEMENT,TEXT)#模式替換函數

例如:$(patsubst %.c,%.o,$src)#等價於$(src:%.c=%.o)[常用]

 

3)shell函數,執行shell命令

例如:$(shell ls –d */)

 

多級目錄Makefile

#樣本1-所有的編譯均由主目錄下的Makefile完成


CC= gcc   

CFLAGS  = -Wall -g

 

BIN     = main  

 

SUBDIR  = $(shell ls -d */)#SUBDIR儲存了目前的目錄下的子目錄

ROOTSRC = $(wildcard *.c)#ROOTSRC儲存了目前的目錄下的.c檔案

ROOTOBJ = $(ROOTSRC:%.c=%.o)#ROOTOBJ儲存了將ROOTSRC中.c替換為.o檔案之後的結果

 

SUBSRC  = $(shell find $(SUBDIR) -name '*.c')#SUBSRC儲存了所有子目錄下的所有.c檔案

SUBOBJ  = $(SUBSRC:%.c=%.o)#SUBOBJ儲存了將SUBSRC中.c替換為.o檔案之後的結果

 

$(BIN):$(ROOTOBJ) $(SUBOBJ)

        $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)

 

%.o:%.c

        $(CC) $(CFLAGS) -c $< -o $@#將所有的.c產生.o檔案

 

clean:

        rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)

 

 



#樣本2-各個子目錄下都有想對應的Makefile檔案,各個子目錄負責相應的編譯工作

 

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

 

產生分布在多個目錄下的可執行檔

#每個子目錄都需要產生一個可執行檔,目前的目錄的結構如


#各個檔案的內容如下

 

//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)


#執行make之後的結果

 

 

#執行後的目錄結構圖


增添了好多檔案[.o 和 可執行檔]

 

#執行make clean的結果

 

 

#執行之後的結構圖


恢複原樣O(∩_∩)O~




Linux中MakeFile有三個,分別都是幹嘛的?

預設的情況下,make會在工作目錄(執行make的目錄)下按照檔案名稱順序尋找makefile檔案讀取並執行,尋找的檔案名稱順序為:“GNUmakefile”、“makefile”、“Makefile”。
通常應該使用“makefile”或者“Makefile”作為一個makefile的檔案名稱(我們推薦使用“Makefile”,首字母大寫而比較顯著,一般在一個目錄中和目前的目錄的一些重要檔案(README,Chagelist等)靠近,在尋找時會比較容易的發現它)。而“GNUmakefile”是我們不推薦使用的檔案名稱,因為以此命名的檔案只有“GNU make”才可以識別,而其他版本的make程式只會在工作目錄下“makefile”和“Makefile”這兩個檔案。
 
make工程管理器是什?怎編寫makefile檔案

Copyleft_X 回答的很不錯,就是這樣的,我覺得在寫makefile之前,先自己找個好的makefile學習下,在此基礎上修改下,熟悉了makefile怎麼工作之後,對其有了一定的概念上的了結了之後,那再好好看下跟我一起寫makefile這個東西,記住千萬別寫的很複雜,夠用就好了。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.