Makefile第一講:一個簡單的Makefile
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
摘要 假定你對linux已經比較的熟悉,假定你編程已經稍有經驗,本文不會對文章作出太多基礎性解釋,看不懂莫怪,只當作給學習的朋友一個引導思路,我也是一個初學者,邊學邊寫,將學會的教給大家,文章有錯誤之處誤導了朋友,請輕噴
makefile
假定你對linux已經比較的熟悉,假定你編程已經稍有經驗,本文不會對文章作出太多基礎性解釋,看不懂莫怪,只當作給學習的朋友一個引導思路,我也是一個初學者,邊學邊寫,將學會的教給大家,文章有錯誤之處誤導了朋友,請輕噴
main.cpp
#include <iostream>
using namespace std;
int main() {
cout <<"Hello makefile";
return 0;
}
makefile
test:main.o
# 復制代碼請注意,開頭必須是一個tab,而不能是四個空格, 否則make會報錯,這是必須的
g++ main.o -o test
main.o:main.cpp
g++ -c main.cpp -o main.o
clean:
rm main.o test
在此,我會一行一行的解釋給大家,暫且把形如這樣的一個代碼塊命名為編譯塊吧,它倆是密不可分的一個整體:
test:main.o
g++ main.o -o test
- 要特別注意的是復制代碼后,一定要把每行前邊的空格換成tab,在makefile中tab是命令的開始標志,tab后面的被當作命令執行 ,如果是空格在make時肯定會報錯
test:main.o
告訴make命令,執行一個叫test的編譯塊,這個編譯塊依賴main.o
文件(這句啥意思?請繼續看),test編譯塊會執行命令g++ main.o -o test
。g++表明這是編譯c++程序,如果是c程序,請用gcc。這就是題外話了,與makefile無關,如果想了解gcc和g++命令,請在終端輸入:g++ --help
main.o:main.cpp
與上例類似,就不說了,上邊提到test編譯塊依賴main.o文件,依賴的正是它,也就是說當執行test編譯塊時,test編譯塊需要main.o這個文件,于是它就到目錄里去找main.o,但是它在目錄里找不到main.o,這時他就在makefile文件里找main.o這樣一個編譯塊,于是它就找到了main.o:main.cpp
,接著它執行這個編譯塊下邊的命令,然后生成了main.o這個文件,然后再執行test編譯塊中的命令g++ main.o -o test
,最終生成可執行文件./test,由于這是一個最簡單的,沒任何依賴的C++程序,因此:其實main.o這個文件就是一個可執行文件,不信你在命令行試試:./main.o
(可能需要改為可執行權限chmod u+x main.o
)clean:
編譯塊告訴make 當在終端執行make clean
時執行rm main.o test
命令,看到make clean
你是否想到了在終端執行:make main.o
和make test
命令呢?沒有?這學習態度不太好喲,當你執行了這兩個命令,腦子里應該立刻出現一個疑問:為毛我執行make clean
命令就執行clean編譯塊,而我執行make
命令卻執行test編譯塊,我并沒有告訴make我要執行test語句塊啊?make是有約定的,如果你不指定讓它執行哪個編譯塊,他就默認執行第一個編譯塊,不妨把clean編譯塊和第一個互換試試!