Independent Dog

My EDA life record

簡易Makefile教學

1.使用Makefile的原因以及 Compile 過程

簡單來說的話makefile就是一個把你要終端機執行的程序預先設置好讓終端機批次處理的檔案。
好比我今天要將 (cpp檔案 >> 執行檔執行) 這個過程,如果直接在終端機輸入指令的話會有:

1
2
3
g++ -c main.cpp
g++ -o file main.o
file.exe

這三個指令,如果每次修改了程式後就要重新complier,那也就代表要重新輸入指令這對整個工作過程可以說是相當浪費時間的。因此使用makefile去節省這部分的時間是對整個程式開發過程極為重要的一件事!!

在開始簡易指令的介紹前我們先搞懂前面三個指令的用意!
-c 會將cpp檔案編譯成obj檔,也就是xxx.o 裏面包含了將程式轉換成執行檔時的重要資訊,通常直接打開會長的向下面這樣。

1
2
3
4
5
6
7
8
9
10
11
12
7f45 4c46 0201 0100 0000 0000 0000 0000
0100 3e00 0100 0000 0000 0000 0000 0000
0000 0000 0000 0000 4840 0000 0000 0000
0000 0000 4000 0000 0000 4000 2801 2501
0100 0000 6600 0000 0100 0000 6800 0000
6a00 0000 0100 0000 6d00 0000 6f00 0000
0100 0000 7000 0000 7200 0000 0100 0000
7300 0000 7500 0000 0100 0000 7600 0000
7800 0000 0100 0000 7900 0000 0100 0000
7b00 0000 7d00 0000 0100 0000 7e00 0000
8000 0000 0100 0000 8100 0000 0100 0000
8300 0000 8500 0000 0100 0000 8600 0000


接著透過-o這個指令將所有的obj link再一起編譯成執行檔。在windows下就是.exe的執行檔,在linux下就是binery file

2.範例以及簡易指令

Windows

1
2
3
4
5
6
7
8
9
10
11
12
ALL:main exe clean // 整個makefile的執行順序
main: main.o //這行指令執行前需要main.o,如果沒有此檔案先先執行main.o
@g++ -o hw1 main.o //@可以讓這行指令在執行時不要顯示在終端機上
main.o: main.cpp
@g++ -std=c++0x -c main.cpp
// -std=c++0x 是c++11的指令,如果程式中有包含c++11的代碼需要加上這一行
exe:
@hw1.exe //執行hw1.exe
clean:
@del *.o // 刪除所有的obj檔案,以方便下次編譯
@del hw1.exe //清除hw1.exe檔案

Linux(指令是相對的,只是指令格式上有所不同)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ALL: clean1 main exes clean
clean1:
//在前面多加一個清除指令指示應為有時候程式編譯錯誤英此後續的清除沒有執行,
//為了怕麻煩在前面先進行一次清除
@rm *.o
main: main.o
@g++ -o exe main.o parser.o run.o
main.o: main.cpp
@g++ -std=c++11 -c -O3 main.cpp parser.cpp run.cpp
exes:
@./exe data/case0 data/case0_s
clean:
@rm *.o
@rm exe
@g++ -c main.cpp

3. Hello World!!

開一個新文字檔將以下內容儲存並將附檔名改成.cpp

1
2
3
4
5
6
#include <iostream>
int main()
{
std::cout<< "Hello World!! <<endl;
return 0;
}

再開一個新文字檔並將檔名命名為Makefile但不要有附檔名

1
2
3
4
5
6
7
8
9
10
ALL:main exe clean
main: main.o
@g++ -o file main.o
main.o: main.cpp
@g++-c main.cpp
exe:
@file.exe
clean:
@del *.o
@del hw1.exe

接著將終端機路徑切至放置此兩檔案的資料夾內並在指令欄中打入make
Hello World!!
就會出現在終端機螢幕上啦!!

以上都只是相對簡易的教學,如果有興趣的話可以自己搜尋 gnu make 或者參考以下超連結。
於鳳昌翻譯版

⬅️ Go back