多文件的Makefile
Linux下編寫一般采用gcc編譯工具,但gcc無法滿足大量的文件同時編譯,這是就用到Makefile,首先先介紹一下gcc
?GCC編譯的四個步驟
? 1.預處理,生成預編譯文件(.文件):
??? ??? Gcc –E hello.c –o hello.i
??? 2.編譯,生成匯編代碼(.s文件):
??? ??? Gcc –S hello.i –o hello.s
??? 3.匯編,生成目標文件(.o文件):
??? ??? Gcc –c hello.s –o hello.o
??? 4.鏈接,生成可執行文件:
??? ??? Gcc hello.o –o hello
在成功編譯之后,就進入了鏈接階段。在這里涉及到一個重要的概念:函數庫。
讀者可以重新查看這個小程序,在這個程序中并沒有定義”printf”的函數實現,且在預編譯中包含進的”stdio.h”中也只有該函數的聲明,而沒有定義函數的實現,那么,是在哪里實現”printf”函數的呢?最后的答案是:系統把這些函數實現都被做到名為libc.so.6的庫文件中去了,在沒有特別指定時,Gcc會到系統默認的搜索路徑”/usr/lib”下進行查找,也就是鏈接到libc.so.6庫函數中去,這樣就能實現函數”printf”了,而這也就是鏈接的作用。
一:自動化變量
在上述的模式規則中,目標和依賴文件都是一系例的文件,那么我們如何書寫一個命令來完成從不同的依賴文件生成相應的目標?因為在每一次的對模式規則的解析時,都會是不同的目標和依賴文件。
自動化變量就是完成這個功能的。在前面,我們已經對自動化變量有所提涉,相信你看到這里已對它有一個感性認識了。所謂自動化變量,就是這種變量會把模式中所定義的一系列的文件自動地挨個取出,直至所有的符合模式的文件都取完了。這種自動化變量只應出現在規則的命令中。
下面是所有的自動化變量及其說明:
當你希望只對更新過的依賴文件進行操作時,"$?"在顯式規則中很有用,例如,假設有一個函數庫文件叫"lib",其由其它幾個object文件更新。那么把object文件打包的比較有效率的Makefile規則是:
lib : foo.o bar.o lose.o win.o
ar r lib $?
在上述所列出來的自動量變量中。四個變量($@、$<、$%、$*)在擴展時只會有一個文件,而另三個的值是一個文件列表。這七個自動化變量還可以取得文件的目錄名或是在當前目錄下的符合模式的文件名,只需要搭配上"D"或"F"字樣。這是GNU make中老版本的特性,在新版本中,我們使用函數"dir"或"notdir"就可以做到了。"D"的含義就是Directory,就是目錄,"F"的含義就是File,就是文件。
二:關于命令參數的變量
下面的這些變量都是相關上面的命令的參數。如果沒有指明其默認值,那么其默認值都是空。
開始寫Makefile
文件中程序目錄如下圖
使用自動變量的Makefile
CC=g++ CPPFLAGES=-lpthread -Wall -std=c++11EXEC=main OBJS=main.o threadpool.o condition.o.PHONY:clean$(EXEC):$(OBJS)$(CC) $^ -o $@ $(CPPFLAGES)$(OBJS):%.o:%.cpp$(CC) -c $< -o $@ $(CPPFLAGES)NOTE:$(OBJS):%.o:%.c中 %.o:%.c 是將 $(OBJS) 中以 .o 結尾的文件替換成以 .c 結尾的文件。(靜態模式)?
自動推導規則
使用命令 make 編譯擴展名為 .c 的 C 語言文件的時候,源文件的編譯規則不用明確地給出。這是因為 make 進行編譯的時候會使用一個默認的編譯規則,按照默認規則完成對 .c 文件的編譯,生成對應的 .o 文件。它執行命令?cc -c?來編譯 .c 源文件。在 Makefile 中只需要給出需要重建的目標文件(一個 .o 文件),make 會自動為這個 .o 文件尋找合適的依賴文件(對應的 .c 文件),并且使用默認的命令來構建這個目標文件。?
對于上邊的例子,默認規則是使用命令cc -c main.c -o main.o來創建文件 main.o 。對一個目標文件是“文件名.o“,依賴文件是”文件名.c“的規則,可以省略其編譯規則的命令行,由 make 命令決定如何使用編譯命令和選項。此默認規則稱為 make 的隱含規則。?
這樣,在書寫 Makefile 時,就可以省略掉描述 .c 文件和 .o 依賴關系的規則,而只需要給出那些特定的規則描述(.o 目標所需要的 .h 文件)。因此上面的例子可以使用更加簡單的方式書寫, Makefile 文件的內容如下:?
CC=g++ CPPFLAGS=-Wall -lpthread -std=c++11EXEC=main OBJ=main.o threadpool.o condition.o.PHONY:clean$(EXEC):$(OBJ)$(CC) -o $(EXEC) $(OBJ) $(CPPFLAGS)clean:rm -rf $(EXEC)rm -rf $(OBJ)chmod a+x $(TARGET)表示把helloworld強制變成可執行文件。?
https://www.cnblogs.com/OpenShiFt/p/4313351.html
https://blog.csdn.net/guoxiaojie_415/article/details/52206139
轉載于:https://www.cnblogs.com/tianzeng/p/9319397.html
總結
以上是生活随笔為你收集整理的多文件的Makefile的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 弹弓的制作方法
- 下一篇: 枪手喷石榴树上的腻虫可以吗果实成熟后还能