Linux 自動化構建工具 make/Makefile

哈哈哈hh發表於2022-06-20

映象下載、域名解析、時間同步請點選  阿里雲開源映象站

VS中有一鍵編譯+自動執行,Linux也給我們提供了對應的編譯方式,雖然不及VS那麼便捷,但是相比於手動輸入 gcc -o add add.c ,我們一句make就可以搞定

Makefile是一個檔案,能夠存放上述 gcc -o add add.c 這種編譯指令

make是一個命令工具,能夠解釋Makefile中的指令

要如何編譯.c檔案,關鍵就在於Makefile是怎麼寫的,下面我們主要介紹這兩者的使用

一、 單個檔案的編譯

假設我們要編譯這麼一個test.c檔案,我們希望編譯生成一個名為test的可執行檔案

file

我們在test.c所在目錄下建立一個Makefile檔案,這裡有兩種編譯寫法

1、寫法一:逐個生成.i、.s、.o檔案,最後再生成 test執行檔案

先一步步向下分析,需要什麼依賴檔案,然後再一步步生成

file

編寫好以後,我們只需要在命令列輸入make,系統就會幫我們自動編譯了,同時會生成每一步產生的檔案按

file

2、 寫法二:一步到位,直接通過 test.c 生成 test 執行檔案(推薦)

Makefile中要寫的內容如下

file

第一行:確定好依賴檔案和目標檔案。也就是要用依賴檔案來生成目標檔案

第二行:編譯指令。

            $@ 指向第一行的目標檔案,表示目標檔案test
            $^ 指向第一行的依賴檔案,表示依賴檔案test.c
            -std 表示採用的C++標準

接下來我們只需要在命令列輸入make,系統就會幫我們編譯了,編譯成功以後,當前目錄下就會多出一個test 執行檔案

file

file

3、 Makefile自動清理

我們每次開始編譯之前,我們最好先清理一下之前生成的執行檔案,手動輸入 rm test 有點太麻煩了,Makefile只要寫入下面的內容,就會自動幫我們清理了

file

如果我們還希望移除生成的.o 、.s、.i檔案,那麼第6行只要換成

rm -f test test.o test.s test.i

一般我們make的時候,系統會自動呼叫,當然也可以手動呼叫,如

file

file

我們會發現之前的test執行檔案不見了

二、多個檔案的編譯(同一目錄下)

現在我們有三個檔案,分別是test.c、sub.c、sub.h,而且我們要在test.c中呼叫sub.h中的函式

file

Makefile中的內容如下:

file

test執行檔案 要依賴 多個檔案生成的 .o檔案,現在沒有 .o檔案,所以需要重新生成 .o檔案

當前路徑下有多個.c檔案,我們逐個去寫的話,就是

test.o:test.c
    gcc -c $@ $^
sub.o:sub.c
    gcc -c $@ $^

但是這樣寫太複雜了,我們可以選擇下面這種寫法

%.o: %.c
    gcc -c $<
  • %.o:表示目標檔案是 .o檔案

  • %.c:表示依賴檔案是當前路徑下的 .c檔案,可以看作是一個集合中放著 test.c sub.c

  • $< : 展開%.c ,逐個生成對應的 .o檔案,比如test.c就會生成對應的test.o、sub.c就會生成對應的

      sub.o

現在我們來執行一下

file

file

三、多個檔案的編譯(不同目錄下)

現在我們有三個檔案,test.c、sub.h、sub.c,但是其中sub.h、sub.c在其目錄func_dir 下

file

file

Makefile的內容如下:

file

現在我們來執行一下試試

file

file

四、一次生成多個執行檔案

1、常規寫法嘗試及其不可行的原因

= 常規寫法嘗試=

上面的都是一個main函式檔案 + 一堆函式檔案的編譯,但是有的時候,比如不同程式間通訊時,我們可能需要一次生成兩個執行檔案,如果我們按照常規的思路來寫,會怎麼樣?

file

file

測試結果如下,我們發現只生成了一個執行檔案,很顯然無法按照常規的寫法來寫

file

= 原因分析=

Makefile自動構建結束會生成執行檔案,預設只生成最開始的一個,我們寫的時候,server的生成放在client的前面,server就是最開始的哪一個,所以Makefile就只生成了 server

2、改進

Makefile既然生成server以後,就不會繼續生成下一個執行檔案,那麼我們就要在這之前就告訴Makefile,我希望生成兩個執行檔案(因為Makefile是自頂向下執行的,不會上來就去執行gcc指令)

file

然後我們再來看一下測試結果,現在就能一次生成兩個執行檔案了

file

本文轉自:https://blog.csdn.net/challenglistic/article/details/124249349


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2901677/,如需轉載,請註明出處,否則將追究法律責任。

相關文章