review makefile

今天重新複習了makefile

關於makefile,就是一系列規則,用來規定對文件編譯,連接,彙編的規則

先說一下,在gcc後面
-o表示對生成的文件取另外一個名字
-c表示編譯不連接
-C表示進入一個目錄


首先,在一個文件夾下創建一個main.c函數
實現爲
#include "kaito.h"

void main()
{
    printf("This is the main function\n");
    func1();
}

在同一個文件夾下創建kaito.h
實現爲
#include

在同一文件夾下創建func1.c
實現爲
void func1()
{
    printf("This is the function1!(be the same folder with main)\n");
}

以上三個文件就是我們要操作的文件,需要對他們進行編譯、連接,所以在同一文件夾下創建一個makefile(或者Makefile)來按一定規律編譯連接他們
實現爲
obj=main.o func1.o

mk : $(obj)
gcc $(obj) -o mk
%.o : %.c
gcc $< -c -o $@
clean :
-rm *.o mk

這裏面第一行obj是一個變量,在makefile裏面,變量都可以看做字符串,我覺得更準確的應該看做宏定義,因爲在用變量的時候就相當於把變量後面的內容直接代到裏面來用
所以下面出現$(obj)的地方就相當於是main.o func1.o,$()是對一個變量的引用
比如下面兩行
mk : $(obj)
gcc $(obj) -o mk
表示我們想要生成mk這個文件,需要有冒號:後面的文件存在作爲依賴
具體這些文件的操作就是用gcc來編譯,把$(obj)所代表的文件編譯、連接成mk文件(在不寫-c的情況下,gcc默認會幫你連接的(在存在相互調用的情況下,若不調用想連接則用ld不用gcc))

接下來%.o: %.c表示,對於任何.o文件都由與他名字一樣的.c文件作爲依賴來編譯
gcc $< -c -o $@
其中$<表示對應的依賴.c,$@表示對應的要生成的文件.o

clean :
-rm *.o mk
當執行make clean的時候就是刪除所有.o文件 和mk,-rm和rm的區別就在於對-rm對於要刪除不存在的文件不會報錯,讓rm去刪除不存在的文件時,她會報錯


這樣,簡單的makefile就算完成了

但是在一個工程裏面,往往有許多文件夾,我們要用來作爲依賴的文件可能與現在的文件不在同一個文件夾下,我們在make的時候希望進入子目錄去用子目錄裏的文件,這樣我們需要在子目錄也建一個makefile,來做一些規則

現在我在main所在的文件夾下創建一個子目錄lib,裏面有func2.c和func3.c
func2.c實現
void func2()
{
    printf("This is the function2!(not the same folder with main)\n");
    func3();
}

func3實現
void func3()
{
    printf("This is function3(used in func2)\n");
}

如果單單要編譯這兩個文件,並且連接起來(注意沒有其他文件調用這兩個文件,則不能用gcc,改用ld),makefile則是
obj=func2.o func3.o

lib.o : $(obj)
ld $(obj) -r -o lib.o

%.o : %.c
gcc $< -c -o $@

clean : 
-rm *.o
這裏我們要生成的文件叫做lib.o,用來上一層目錄的連接用

同樣需要修改上一層的main.c函數和makefile
main.c實現
#include "kaito.h"

void main()
{
    printf("This is the main function\n");
    func1();
    func2();
}

頂層makefile實現
obj=main.o func1.o lib/lib.o

mk : $(obj)
gcc $(obj) -o mk
%.o : %.c
gcc $< -c -o $@
lib/lib.o : 
make -C ./lib
clean :
-rm *.o mk
make clean -C ./lib
在這次頂層makefile修改中,第一行中的lib/lib.o表示在子目錄lib下的lib.o文件(也作爲依賴)
而lib目錄下的lib.o文件的生成則依賴於它所在的目錄的makefile,所以
lib/lib.o : 
make -C ./lib
-C表示 先進入./lib目錄,然後執行相當於在終端下的make一樣;就是進入/lib/目錄,執行make(這樣就會得到lib/lib.o這個文件了),最後的make clean同理

文件結構
頂層目錄
review <wbr>makefile
子目錄
review <wbr>makefile
而實現的效果是
review <wbr>makefile

review <wbr>makefile

review <wbr>makefile

make clean就不演示了,在我寫這篇文章的時候差點瀏覽器卡死,嚇得我就把虛擬機關了(那是已經絕望了,以爲辛辛苦苦打了這麼多字又要重新寫T_T。。。。。。)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章