或許很多Winodws 的程式員都不知道這個東西,因為那些Windows 的IDE都為你做了這個工作,但我覺得要作一個好的和 professional 的程式員,makefile 還是要懂。在Linux 下的軟體編譯,你就不能不自己寫makefile 了,會不會寫makefile,從一個側面說明瞭一... ...
原文鏈接:https://blog.csdn.net/qq_38646470/article/details/79917494
專欄鏈接:https://blog.csdn.net/column/details/20028.html
或許很多Winodws 的程式員都不知道這個東西,因為那些Windows 的IDE都為你做了這個工作,但我覺得要作一個好的和 professional 的程式員,makefile 還是要懂。在Linux 下的軟體編譯,你就不能不自己寫makefile 了,會不會寫makefile,從一個側面說明瞭一個人是否具備完 成大型工程的能力。
makefile 關係到了整個工程的編譯規則。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若幹個目錄中,makefile 定義了一系 列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更複雜的功能操作,因為makefile 就像一個Shell 腳本一樣,其中也可以執行操作系統的命令。
makefile 帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make 命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。
下麵就來看如何寫Makefile文件:
Makefile文件編寫規範:
目標:依賴文件
$^ 代表所有依賴文件
$@ 代表所有目標文件
$< 代表第一個依賴文件
% 代表通配符
@指令:屏蔽指令
定義變數(變數大寫)
變數名=值1 值2 ...
使用變數 $(變數名)
下來看事例:
假設我們有很多個文件(fun1.c fun2.c fun3.c main.h)
假設最後我們就想得到main一個文件
初級版:
.PHONY : clean
main : fun1.o fun2.o fun3.o main.o
gcc -g fun1.o fun2.o fun3.o main.o -o main
fun1.o : fun1.c main.h
gcc -Wall -c -g -o fun1.o
fun2.o : fun2.c main.h
gcc -Wall -c -g -o fun2.o
fun3.o : fun3.c main.h
gcc -Wall -c -g -o fun3.o
clean :
rm -rf *.o
精簡版
.PHONY : clean
FM=fun1.o fun2.o fun3.o main.o
main : $(FM)
(前面一個tab鍵)gcc -g $^ -o $@
%.c : %.o
(前面一個tab鍵)gcc -c -g - Wall $< -o $@
clean :
(前面一個tab鍵)rm -rf *.o
看看測試效果:
當然Makefile 還有很多其他的用處,如需更深層次瞭解請看makefile深度解析