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