@[toc] 在軟體的工程中的原始檔是很多的,其按照型別、功能、模組分別放在若干個目錄和檔案中,哪些檔案需要編譯,那些檔案需要後編譯,那些檔案需要重新編譯,甚至進行更複雜的功能操作,這就有了我們的系統編譯的工具。
在linux和unix中,有乙個強大的實用程式,叫make,可以用它來管理多模組程式的編譯和鏈結,直至生成可執行檔案。
make程式需要乙個編譯規則說明檔案,稱為makefile,makefile檔案中描述了整個軟體工程的編譯規則和各個檔案之間的依賴關係。
makefile就像是乙個shell指令碼一樣,其中可以執行作業系統的命令,它帶來的好處就是我們能夠實現「自動化編譯」,一旦寫好,只要乙個make命令,整個軟體功能就完全自動編譯,提高了軟體開發的效率。
make是乙個命令工具,是乙個解釋makefile中指令的命令工具,一般來說大多數編譯器都有這個命令,使用make可以是重新編譯的次數達到最小化。
makefile檔案的規則可以非常複雜,比c程式還要複雜,我通過示例來介紹它的簡單用法。
檔名:makefile,內容如下:
all:book1 book46
book1:book1.c
gcc -o book1 book1.c
book46:book46.c _public.h _public.c
gcc -o book46 book46.c _public.c
clean:
rm -f book1 book46
第一行
all:book book46
all: 這是固定的寫法。
book1 book46表示需要編譯目標程式的清單,中間用空格分隔開,如果清單很長,可以用換行。
第二行
makefile檔案中的空行就像c程式中的空行一樣,只是為了書寫整潔,沒有什麼意義。
第三行
book1:book1.c
book1:表示需要編譯的目標程式。
如果要編譯目標程式book1,需要依賴源程式book1.c,當book1.c的內容發生了變化,執行make的時候就會重新編譯book1。
第四行
gcc -o book1 book1.c
這是乙個編譯命令,和在作業系統命令列輸入的命令一樣,但是要注意乙個問題,在gcc之前要用tab鍵,看上去像8個空格,實際不是,一定要用tab,空格不行。
第六行
book46:book46.c _public.h _public.c
與第三行的含義相同。
book46:表示編譯的目標程式。
如果要編譯目標程式book46,需要依賴源程式book46.c、_public.h和_public.c三個檔案,只要任何乙個的內容發生了變化,執行make的時候就會重新編譯book46。
第七行
gcc -o book46 book46.c _public.c
與第四行的含義相同。
第九行
clean:
清除目標檔案,清除的命令由第十行之後的指令碼來執行。
第十行
rm -f book1 book46
清除目標檔案的指令碼命令,注意了,rm之前也是乙個tab鍵,不是空格。
makefile準備好了,在命令提示符下執行make就可以編譯makefile中all引數指定的目標檔案。
程式make編譯目標程式。
再執行一次make。
因為全部的目標程式都是最新的,所以提示沒有目標可以編譯。
執行make clean,執行清除目標檔案的指令。
再執行make重新編譯。
修改_public.c程式,隨便改點什麼,只要改了就行。
然後再make
注意了,因為book46依賴的源程式之一_public.c改變了,所以book46重新編譯。
book1沒有重新編譯,因為book1依賴的原始檔並沒有改變。
makefile中,變數就是乙個名字,變數的值就是乙個文字字串。在makefile中的目標,依賴,命令或其他地方引用變數時,變數會被它的值替代。
我通過示例來介紹它的簡單用法。
cc=gcc
flag=-g
all:book1 book46
book1:book1.c
$(cc) $(flag) -o book1 book1.c
book46:book46.c _public.h _public.c
$(cc) $(flag) -o book46 book46.c _public.c
clean:
rm -f book1 book46
第一行
cc=gcc
定義變數cc,賦值gcc。
第二行
flag=-g
定義變數flag,賦值-g。
第七行
$(cc) $(flag) -o book1 book1.c
$(cc)和$(flag)就是使用變數cc和flag的值,類似於c語言的巨集定義,替換後的結果是:
在makefile檔案中,使用變數的好處有兩個:1)如果在很多編譯指令採用了變數,只要修改變數的值,就相當於修改全部的編譯指令;2)把比較長的、公共的編譯指令採用變數來表示,可以讓makefile更簡潔。
yml檔案tab 空格 YAML檔案格式語法
yaml基礎 學習k8s就不得不學習下yaml語法了 yaml是一種簡潔的非標記語言,yaml以資料為中心,使用空白,縮排,分行組織資料,從而使得表示更加簡潔易讀。yaml語法規則 大小寫敏感 使用縮排表示層級關係 縮排時不允許使用tab鍵,只允許使用空格 縮排的空格數目不重要,只要相同層級的元素左...
將檔案中的tab轉換為space空格
在之前的一篇文章中提到了在vim中將tab符轉換為空格的方法,其實,和處理檔案中的 m的方法類似,在linux中還有其它的方法可以將檔案中的tab和space相互轉換。使用sed sed i s t g filename,其中 i是在命令列中輸入來鍵入的,此方法將所有tab替換為4個空格。在vi中使...
關於linux各檔案因為tab或者空格導
2.在make menuconfig的時候,指定交叉編譯器或者根目錄的路徑時 例 home 使用者 fl2440 rootfs 例 home 使用者 fl2440 rootfs 即使產生了.config檔案,但是make之後在 home 使用者 fl2440 rootfs 此目錄中沒有出現相應的檔案...