1. 程式人生 > >Linux C語言程式設計(中篇) | make的使用

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可再次簡化: