工程管理檔案makefile用法

2021-09-25 10:17:18 字數 2852 閱讀 2049

src/      -> 所有的.c檔案

include/  -> 所有的.**件

lib/      -> 所有的庫檔案

bin/      -> 編譯之後的可執行檔案

makefile  -> 裡面有一套可以編譯整個專案的規則。

如果沒有makefile,使用者gcc編譯應該每次都要輸入: "gcc main.c fun.c  -o main "

學習書寫makefile之後,就可以讓makefile幫我們做這件事情了。

[目標檔案]:[依賴檔案]

[tab鍵][執行命令]            //此處tab鍵不可用空格代替

aa目錄檔案:bin

include  lib

makefile

src

src目錄檔案:fun.c   main.c

include目錄檔案:  head.h

1、將工程裡不包括main.c的檔案找到,將這些.c檔案編譯為.o檔案,這裡符合條件的是src目錄下的fun.c檔案

gcc fun.c -o fun.o -c   -i ../include      

//在src目錄下執行這行命令,因為編譯這.c需要標頭檔案,標頭檔案不在src目錄下,

//所以 -i ../include 告訴系統如果當前目錄沒有找到標頭檔案,那就去上一級目錄的include目錄下找

2、將這些.o檔案編譯為 lib***.a(靜態庫檔案格式)

ar rcs ../lib/libmy.a fun.o

//因為目前是在src目錄下編譯,這裡將編譯好的libmy.a庫檔案

//放在它的上一級目錄下的lib目錄下(也就是和src同級目錄的lib目錄下)

3、gcc編譯程式

gcc main.c -o main -l ../lib -lmy -i ../include 

//此處main是生成在當前目錄下的

//-lmy -l(小寫字母l)沒有空格的,要緊跟庫的名字(my),注意不是庫檔案的名字(libmy.a)

//-i ../include 告訴系統如果當前目錄沒有找到標頭檔案,那就去上一級目錄的include目錄下找

4、執行

./main

//執行完上一步操作編譯就會生成mian檔案,現在執行。

gcc編譯以後,我們來試試makefile吧:

cc=gcc                   

atrget=./bin/main //目標檔案,將main生成到./bin 目錄下

c_source=$(wildcard ./src/*.c) //依賴檔案,匹配./src 目錄下所有.c檔案

include_path=-i ./include

library_path=-l ./lib -lmy

$(atrget):$(c_source)

$(cc) $^ -o $@ $(library_path) $(include_path) //執行命令

.phony:clean

clean:

$(rm) $(atrget) //在ubuntu終端輸入make clean 刪除生成的main檔案

//在aa目錄下執行make,就可以執行這裡裡面的內容。

//注意:./src目錄下 fun.c可以手動刪除,沒有影響,fun.c檔案已被封裝為靜態庫檔案了,所以說

沒什麼作用了,可以刪除fun.c。

"依賴"  -> 在編譯檔案時,才需要寫依賴,如果不是編譯,則不需要寫依賴。一般依賴指的就是.c檔案。

"目標"  -> 你最終想得到的檔案,一般指的是可執行程式

2)在編譯規則中如何呼叫依賴與目標(自動化變數   -> 變數的值不是固定的,而是會變化的。)

$^   -> 代表所有的依賴檔案  -> 等價於  main.c fun1.c fun2.c

$@   -> 代表目標檔案       -> 等價於 main

例子:main:

$@  -> 代表main

clean:

$@  -> 代表clean

例如:a=./aaa/bbb    //makefile變數只有字串型別

則呼叫時 $(a)

有些變數是系統中已經寫好的,並且已經賦了初值的,這些變數的值就可以直接使用。

cc:  -> 編譯器名字,預設系統賦值是cc   cc=cc   cc等價於gcc

rm:  -> 刪除命令,預設系統賦值是rm -f   rm=rm -f

解決方案:將clean這個目標新增為偽指令。

新增為偽指令的含義是什麼?

就是告訴makefile,這個目標不是乙個生成的檔案。

在makefile中新增**:

.phony:clean

1. makefile中呼叫函式方式: $(函式名 引數1,引數2,引數3.....)

c語言中呼叫函式方式:    函式名(引數1,引數2,引數3...)

2. wildcard函式作用: 在指定的路徑下找到相匹配的檔案

例子: src = $(wildcard *.c)  -> 在當前目錄下尋找所有的.c結尾的檔案,並把結果儲存在src變數,每個結果之間使用空格分開。

src = $(wildcard /*.c)  -> 在根目錄下尋找所有的.c結尾的檔案。

工程管理 makefile檔案

乙個工程中的原始檔不計數,其按型別 功能 模組分別放在若干個目錄中,編譯需要花費很多時間,還有可能出錯。makefile 定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為makefile 就像乙個 shell 指令碼一樣,其中也...

Makefile工程管理

1 makefile用途 make的工作主要依賴於乙個叫makefile的檔案。makefile檔案描述了整個程式的編譯,鏈結等規則。其中包括 工程中的哪些原始檔需要編譯以及如何編譯,如何最後產生我們想要的可執行檔案。2 makefile中最重要的組成部分是規則 規則 用於說明如何生成目標檔案,規則...

makefile工程管理

當工程量少時,可以採用gcc檔案單個編譯。像linux kernel 1萬多個時採用make管理。linux程式設計師必須學會使用gnu make來構建和管理自己的軟體工程。make在執行時,需要乙個命名為makefile的檔案。makefile檔案描述了整個工程的編譯 鏈結等規則。makefile...