Makefile多檔案編譯

2021-10-06 16:48:57 字數 3132 閱讀 2953

├── include

│   └── test.h

├── main

│   ├── main.c

│   └── makefile

├── makefile

├── obj

│   └── makefile

├── src

│   ├── eat

│   │   ├── eat.c

│   │   ├── eat.h

│   │   └── makefile

│   ├── makefile

│   └── test.c

└── test.h

test.**件

#include#includeint testprint();//將test.c檔案中函式的實現與宣告分開

int mainprint();//將main.c檔案中函式的實現與宣告分開

int calleatprint();//呼叫eat.c檔案中的eatprint()

main.c

#include"../include/test.h"

int mainprint()

int main()

test.c

#include"../include/test.h"

#include"./eat/eat.h"

int testprint()

int calleatprint()

eat.h

#include"../include/test.h"

int eatprint();

eat.c

#include"eat.h"

int eatprint()

cc = gcc    #設定編譯器

obj := main.o test.o eat.o#設定所有會生成的目標檔案,為最後一步連線可執行檔案

top_dir := $(pwd)#獲取當前檔案的目錄,將其存入變數中

obj_dir := $(top_dir)/obj#設定目標檔案存放的目錄

bin_dir:=$(top_dir)/bin#設定可執行檔案存放的目錄

bin:=test#設定可執行檔案名字

sub_dir:=main \

src \

src/eat \

obj#儲存所有子目錄下的makefile的路徑。只要子目錄有makefile存在,就在這個地方新增相對頂層makefile的路徑

export cc src include obj top_dir obj_dir bin_dir bin#將1~6行的變數設定成全域性變數,在子目錄的makefile裡面可以直接使用這些變數

all:checkdir $(sub_dir)#讓多個目標操作順次執行

checkdir:

mkdir -p $(sub_dir) $(bin_dir)#建立一大堆目錄,目錄存在就不建立了

$(sub_dir):echo

make -c $@#遍歷make所有目錄下面的makefile

echo:

@echo $(sub_dir)

@echo begin compile

clean:

rm -rf $(obj_dir)/*.o $(bin_dir)#執行make clean 就會執行clean部分

執行邏輯:

首先查詢依賴部分「echo」,就是一些列印資訊,echo前面的『@』符號不加也是可以的。

接著就是執行:make -c  $(sub_dir) (-c是大寫的c,小寫的c編譯出目標檔案)

-c 引數的含義: -c directory, --directory=directory  change to directory before doing anything.

翻譯過來就是:在離開這個目錄前做點什麼。

加上-c 選項意思就是:在$(sub_dir) 目錄下面執行make

make -c  $(sub_dir) 展開就是:make -c main/  src/ src/eat/ obj/ :按順序對各個目錄下面的makefile,make一下。

$(obj_dir)/test.o:test.c

$(cc) -c $^ -o $@

$(obj_dir)/main.o:main.c

$(cc) -c $^ -o $@

$(bin_dir)/$(bin):$(obj)

$(cc) $^ -o $@

$(obj_dir)/eat.o:eat.c

$(cc) -c $^ -o $@

.

├── bin

│   └── test

├── include

│   └── test.h

├── main

│   ├── main.c

│   └── makefile

├── makefile

├── obj

│   ├── eat.o

│   ├── main.o

│   ├── makefile

│   └── test.o

└── src

├── eat

│   ├── eat.c

│   ├── eat.h

│   └── makefile

├── makefile

├── test.c

└── test.o

in main.c file

in main.c implementation mainprint

in test.c implementation testprint

in test.c implemetation calleatprint

in eat.c implementation eatprint

參考:

Linux下C多檔案編譯Makefile

第一 makefile檔案編寫 1.第乙個字母大寫,其餘的都是小寫。2.makefile關係到了整個工程的編譯。3.可以執行作業系統的命令。4.其實makefile的本質是定義了檔案之間的依賴性問題。5.第乙個字母大寫,其餘的都是小寫。make命令執行時,需要乙個 makefile 檔案,以告訴ma...

g 多檔案編譯和簡單MakeFile檔案寫法

上文 g 基本用法 介紹簡單的 g 編譯器的用法,只是針對沒有依賴關係的單個檔案的操作,當我們有多個檔案需要編譯的時候,是如何工作的呢?下面以簡單的例項進行介紹,然後把例項以 makefile 檔案實現,並對 makefile 檔案進行簡單介紹。準備工作,下面是需要的簡單例項檔案及 main.cxx...

g 多檔案編譯和簡單MakeFile檔案寫法

分類 linux相關知識 2013 12 02 16 05 2533人閱讀收藏 舉報 上文 g 基本用法 介紹簡單的 g 編譯器的用法,只是針對沒有依賴關係的單個檔案的操作,當我們有多個檔案需要編譯的時候,是如何工作的呢?下面以簡單的例項進行介紹,然後把例項以 makefile 檔案實現,並對 ma...