Linux C語言程式設計(中篇) | make的使用
上一篇Linux C語言程式設計(上篇) | gcc的使用講述瞭如何使用gcc進行編譯,其中只是對hello.c
這一個檔案進行編譯,那麼當我們需要編譯多個檔案的時候該怎麼做呢?
1.多檔案編譯例項
這個例子中分別在四個檔案(add.c
, dec.c
, mul.c
, div.c
)實現相應的運算函式,在標頭檔案main.h
裡宣告,在主函式(main.c
)進行呼叫,首先編寫程式碼如下:
-
main.h
-
add.c
-
dec.c
-
mul.c
-
div.c
-
main.c
然後使用gcc新增多個檔案進行編譯:
gcc add.c dec.c mul.c div.c main.c -o cal
這個例項中只有5個原始檔和1個頭檔案,可以直接一句gcc命令解決,那麼,當我們需要編譯的是包含幾十個原始檔的標頭檔案的工程呢?這個時候就需要使用強大的make編譯構建工具了~
2.make與makefile
make也屬於GNU專案的一部分,是一個編譯構建工具,當我,我們執行make命令時,makefile會告訴make工具如何編譯和連結這些檔案,所以,如何編寫makefile是使用make工具的核心。
3.編寫makefile
3.1.makefile組成
一個基本的makefile包含3部分:
- 目標體(target):make工具建立的目標體,目標檔案或者可執行程式;
- 依賴檔案(dependency_file):構建目標體所依賴的檔案(原料)
- 命令(command):構建目標體所執行的命令
3.2.makefile基本格式
比如開頭提到的例項,可以編寫如下makefile:
然後執行make cal
命令即可,注意:如果直接使用make
,make工具會生成makefile檔案中定義的第一個目標,所以此處可直接使用make
:
3.3.makefile 偽目標
這些目標並沒有依賴檔案,所以稱為偽目標,相當於執行命令的指令碼,比如:
向之前的makefile新增clean偽目標:
可以看到刪除命令執行:
3.4.makefile 變數
現在的makefile中還包含著大量的重複字元,所以可以使用變數代替~
3.4.1.變數定義
- 遞迴展開方式:在使用到該變數的時候進行替換,格式:
var = <value>
- 直接展開方式:在定義處展開,並且只展開一次,格式:
var:= <value>
3.4.2.變數使用
使用$(<變數>)
的格式使用。
3.4.3.變數分類
makefile中的變數分為以下四類:
- 使用者自定義變數
- 預定義變數
- 自動變數
- 環境變數
3.4.3.1.預定義變數
變數名 | 描述 |
---|---|
CC | C編譯器的名稱,預設為cc |
CXX | C++編譯器的名稱,預設為g++ |
RM | 檔案刪除程式的名稱,預設rm -f |
CFLAGS | C編譯器選項,無預設值 |
CXXFLAGS | C++編譯器選項,無預設值 |
現在可以將makefile改為如下形式:
3.4.3.2.自動變數
命令 | 描述 |
---|---|
$* | 不包含副檔名的目標檔名稱 |
[email protected] | 包含副檔名的目標檔名稱 |
$+ | 所有的依賴檔案(可能包含重複) |
&^ | 所有不重複的依賴檔案 |
所以makefile可再次簡化: