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同理
文件結構
頂層目錄
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.