linux下的makefile编程
linux下編程使用makefile文件
?在談makefile之前,先來看看下面幾個小程序:
程序1:mytool1.c
#include"mytool1.h" #include"stdio.h" void mytool1_print(char* print_str) {printf("This is mytool1 print %s\n", print_str); } 程序2:mytool1.h #ifndef _MYTOOL_1_H #define _MYTOOL_1_H void mytool1_print(char*); #endif程序3;mytool2.c
#include"mytool2.h" #include"stdio.h" void mytool2_print(char* print_str) {printf("This is mytool2 print %s\n", print_str); } 程序4:mytool2.h #ifndef _MYTOOL_2_H #define _MYTOOL_2_H void mytool2_print(char* ); #endif程序5:main.c
#include"mytool1.h" #include"mytool2.h" int main(void) {mytool1_print("hello 1");mytool2_print("hello 2");return 0; }現在我們要運行main.c來打印輸出
This is mytool1 print hello 1
This is mytool1 print hello 2
如圖所示,所有源文件:
我們先按照常用的編譯做法,對五個文件分別編譯。
linux下的c/c++編譯器是 gcc 和 g++, 不過,gcc使用的人比較多,這兩個都能便于c和c++文件,下面以gcc編譯為樣例。??
gcc 的編譯格式大致為:gcc -c 源文件? -o 目標文件
方式不唯一,其中“ c ”的含義是英文單詞 compile 編譯的縮寫,” o “的含義是英文單詞out輸出的縮寫, 如果沒有指定生成目標文件,編譯器默認生成跟源文件同名的編譯文件。
編譯上面的例子:
gcc -c mytool1.c -o mytool.o,這個命令是編譯mytool1.c文件生成目標mytool1.o文件,這里生成文件mytool1其實可以寫成任意的符號或者名稱,如果寫成gcc -c mytool1.c,系統(tǒng)默認生成mytool1.o文件。
以下,是編譯步驟:
gcc -c mytool1.c gcc -c mytool2.c gcc -c main.c下圖是編譯過程和結果。
1.分別編譯三個源文件
?
2.gcc main.o ?-o ?main ?mytool1.o mytool2.o
這句命令是將三個.o文件鏈接成可執(zhí)行的main 程序。輸入./main執(zhí)行程序。
?
通過上面發(fā)現,生成main文件,我們需要編譯了三次,太耗費時間。使用makefile編程,可進行大量編譯。
1、在上面程序的同一路徑建立一個makefile文件,不加后綴名,makefile內容如下所示。
這里的mian是最終的可執(zhí)行程序,名字隨便寫都行。我寫成了mian。
特別注意:gcc前面都是帶有一個tab鍵的空格,這個不能少,少了就出錯。盡量不要復制這幾行代碼,我的代碼可能空格數不對,自己手到進去一個table鍵就行了。
mian:main.o mytool1.o mytool2.ogcc -o mian main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c main.cmytool1.o:mytoo1.c mytool1.hgcc -c mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c mytool2.c ?
makefile內容的解釋:
每兩行為一句,前一行給出生成的文件名,和所需要的文件,后一行給出方法。
mian:main.o mytool1.o mytool2.ogcc -o mian main.o mytool1.o mytool2.o ?上面的代碼解釋為:
第一行解釋:main 程序的生成是依賴main.o mytool1.o mytool2.o文件的。這行給出的是依賴關系。
第二行解釋:這行給出了生成main程序的方法,方法是通過gcc -c main.o mytool1.o mytool2.o方法來生成的,
下面幾行就不講了,原理都是一樣,先給出文件的依賴關系,再給出方法。
編寫好makefile, 用輸入命令" ?make "進行大量編譯,執(zhí)行的順序還是跟上面一樣,截圖如下:
?
2.上面的makefile其實還是不夠簡練,,我們發(fā)現里面反復出現了main.o mytool.o mytool2.o, 于是我們可以找一個變量名來代替它,下面代替名是objects;
下面是精簡后的makefile:內容如下:
objects=main.o mytool1.o mytool2.o main:$(objects)gcc -o mian $(objects) main.o:main.c mytool1.h mytool2.hgcc -c main.c mytool1.h mytool2.h mytool1.o:mytool1.c mytool1.hgcc -c mytool1.c mytool2.o:mytool2.c mytool2.hgcc -c mytool2.c clean: rm *.h.gchrm *.o每個gcc都必須一個tab鍵空格。還要注意圖中的mian和$之間是有空格的,不加空格,編譯會出錯。
clean:
? ? rm *.h.gch
????rm ?*.o
上面的意思是清楚生成的.o文件和.h.gch文件,這些文件是中間文件,可以刪除。
輸入make clean命令就可以清除全部.o文件。
?
總結
以上是生活随笔為你收集整理的linux下的makefile编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java程序转成exe可执行程序方法和e
- 下一篇: 虚拟局域网Vlan划分