├── 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...