C++ make file

Jufeng Wu, 26 August 2019


Makefile是使用gcc下指令的好幫手,畢竟當檔案連結越來越大的時候,一直下gcc大概會累死

寫好Makefile之後,只需要下make就可以自動編譯了,非常的方便
一個專案的架構大概如此範例
裡面有可能有src(source code放的位置),indclude(h file 的位置),以及test(test code的位置)
這時候就需要makefile的幫忙了!

在一個makefile中,可以看到一開始會有一些宣告,例如

CC = g++
INSTDIR = /usr/local/bin
INCLUDE = ./include
CFLAGS = -g -std=gnu++11 -Wall 
LIBS += -framework CoreFoundation

這一些是表示之後參數的別名,之後就可以用縮寫的方式來進行編譯

接下來會使用all,例如

all:main.out test.out clean

這一個意思是最後會build出main.out以及test.out,並且會執行clean的動作

接下來,會寫指令名稱,以及這一個指令的dependency,和指令,例如

main.out: main.o tm_move_api.o tm_test.o
	$(CC) -o main.out main.o tm_move_api.o tm_test.o

這表示,main.out會依賴 main.o以及tm_move_api.otm_test.o
至於main.o以及tm_move_api.otm_test.o的定義,他會往後面去找
而下面的$(CC) -o main.out main.o tm_move_api.o tm_test.o則是指令
其中$(CC)就是之前定義的參數別名,在這裡CC=g++
-o在gcc的指令代表產生output file,這一個output file的名稱是後面的那一個,在這裡是main.out,剩下就是要link的檔案們

再來就是會看到類似這樣的指令

tm_test.o: src/tm_test.cpp src/tm_test.h
	$(CC) -I$(INCLUDE) $(CFLAGS) -c src/tm_test.cpp

這一個的話跟上面的類似,只是這次的dependency 是cpp 和h檔了,所以冒號後面就是cpp 和h檔
下面的指令跟之前的是一樣,其中-I 是表示追加include檔案的搜尋路徑-c是指只編譯不連結,畢竟連結的動作上一行會做連結的動作

最後就是clean,這應該很好懂,就是把這一些暫存檔都清除,這樣畫面比較乾淨,當然也可以不清除啦
clean通常會這樣寫

clean:
	rm -f main.o api.o tm_test.o tm_move_api.o main_test.o string_compare.o

就是把這一些o檔移除

還有一行.PHONY: all,.PHONY 一般來說有兩個目的:

為了避免定義的規則和工作目錄下的檔案名稱發生衝突,以及改善效能

makefile 大概就是這樣,之後如果遇到問題就再繼續補充