鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 VS中有一鍵編譯+自動運行,Linux也給我們提供了對應的編譯方式,雖然不及VS那麼便捷,但是相比於手動輸入 gcc -o add add.c ,我們一句make就可以搞定 Makefile是一個文件,能夠存放上述 gcc -o add add. ...
鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站
VS中有一鍵編譯+自動運行,Linux也給我們提供了對應的編譯方式,雖然不及VS那麼便捷,但是相比於手動輸入 gcc -o add add.c ,我們一句make就可以搞定
Makefile是一個文件,能夠存放上述 gcc -o add add.c 這種編譯指令
make是一個命令工具,能夠解釋Makefile中的指令
要如何編譯.c文件,關鍵就在於Makefile是怎麼寫的,下麵我們主要介紹這兩者的使用
一、 單個文件的編譯
假設我們要編譯這麼一個test.c文件,我們希望編譯生成一個名為test的可執行文件
我們在test.c所在目錄下創建一個Makefile文件,這裡有兩種編譯寫法
1、寫法一:逐個生成.i、.s、.o文件,最後再生成 test執行文件
先一步步向下分析,需要什麼依賴文件,然後再一步步生成
編寫好以後,我們只需要在命令行輸入make,系統就會幫我們自動編譯了,同時會生成每一步產生的文件按
2、 寫法二:一步到位,直接通過 test.c 生成 test 執行文件(推薦)
Makefile中要寫的內容如下
第一行:確定好依賴文件和目標文件。也就是要用依賴文件來生成目標文件
第二行:編譯指令。
$@ 指向第一行的目標文件,表示目標文件test
$^ 指向第一行的依賴文件,表示依賴文件test.c
-std 表示採用的C++標準
接下來我們只需要在命令行輸入make,系統就會幫我們編譯了,編譯成功以後,當前目錄下就會多出一個test 執行文件
3、 Makefile自動清理
我們每次開始編譯之前,我們最好先清理一下之前生成的執行文件,手動輸入 rm test 有點太麻煩了,Makefile只要寫入下麵的內容,就會自動幫我們清理了
如果我們還希望移除生成的.o 、.s、.i文件,那麼第6行只要換成
rm -f test test.o test.s test.i
一般我們make的時候,系統會自動調用,當然也可以手動調用,如
我們會發現之前的test執行文件不見了
二、多個文件的編譯(同一目錄下)
現在我們有三個文件,分別是test.c、sub.c、sub.h,而且我們要在test.c中調用sub.h中的函數
Makefile中的內容如下:
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
現在我們來運行一下
三、多個文件的編譯(不同目錄下)
現在我們有三個文件,test.c、sub.h、sub.c,但是其中sub.h、sub.c在其目錄func_dir 下
Makefile的內容如下:
現在我們來運行一下試試
四、一次生成多個運行文件
1、常規寫法嘗試及其不可行的原因
=常規寫法嘗試=
上面的都是一個main函數文件 + 一堆函數文件的編譯,但是有的時候,比如不同進程間通信時,我們可能需要一次生成兩個運行文件,如果我們按照常規的思路來寫,會怎麼樣?
測試結果如下,我們發現只生成了一個運行文件,很顯然無法按照常規的寫法來寫
=原因分析=
Makefile自動構建結束會生成運行文件,預設只生成最開始的一個,我們寫的時候,server的生成放在client的前面,server就是最開始的哪一個,所以Makefile就只生成了 server
2、改進
Makefile既然生成server以後,就不會繼續生成下一個運行文件,那麼我們就要在這之前就告訴Makefile,我希望生成兩個運行文件(因為Makefile是自頂向下運行的,不會上來就去執行gcc指令)
然後我們再來看一下測試結果,現在就能一次生成兩個運行文件了
本文轉自:https://blog.csdn.net/challenglistic/article/details/124249349