簡單的Makefile入門

最近幾天在複習Makefile的相關知識,現在整理一下一些簡單的入門知識。

首先,命名要麼是Makefile,要麼是makefile,一般命名成Makefile即可。

這裏面的最簡單的框架就是:

target:dependence

<Tab>commands

target:就是要獲得的目標文件

dependence:獲得目標文件所需要的依賴。

commands:是你要做的操作命令

下面用一個最簡單的單文件單依賴來做例子:

所要編譯的文件只有一個a.c,沒有其他源文件,那麼規則就會很簡單:


a: a.o

    cc -o a a.o

a.o: a.c

       cc -c a.c

clean:

    rm -rf a a.o


這樣就可以了,執行make命令即可編譯。


下面再用多個源文件的方式來說明:假設源文件有testing.c, sgp4sdp4.c, sgp8sdp8.c, sgp0.c, sgp_time.c, sgp_deep.c, sgp_conv.c, sgp_math.c這些源文件,還有兩個頭文件:sgp.h, sgp_int.h,所有源文件都是要包含這兩個頭文件的。那麼編譯的時候,如果不用makefile的話,將會非常麻煩,如下:


gcc -c sgp4sdp4.c -o sgp4sdp4.o

gcc -c sgp8sdp8.c -o sgp8sdp8.o

gcc -c sgp0.c -o sgp0.o

gcc -c sgp_time.c -o sgp_time.o

gcc -c sgp_deep.c -o sgp_deep.o

gcc -c sgp_conv.c -o sgp_conv.o

gcc -c sgp_math.c -o sgp_math.o

gcc -c testing.c -o testing.o

然後把目標文件鏈接起來生成可執行文件:

gcc -o kapatest sgp4sdp4.o sgp8sdp8.o sgp0.o sgp_time.o sgp_deep.o  sgp_conv.o sgp_math.o testing.o -lm


要寫這麼多命令才能完成這套代碼的編譯,很麻煩對把?那麼我們就來用Makefile吧。

首先用一個變量cc表示編譯器是gcc,然後用變量objects來表示那麼多的目標文件。


cc=gcc

objects = testing.o sgp0.o sgp_deep.o sgp_math.o\#注意反斜槓後面不能有多餘的空格哦
    sgp_conv.o sgp4sdp4.o sgp8sdp8.o sgp_time.o

kapatest:$(objects)
    $(cc) -o kapatest $(objects) -lm#注意我把鏈接庫就直接加到這裏來了。
testing.o:testing.c sgp.h sgp_int.h
    $(cc) -c testing.c
sgp8sdp8.o:sgp8sdp8.c sgp.h sgp_int.h
    $(cc) -c sgp8sdp8.c
sgp4sdp4.o:sgp4sdp4.c sgp.h sgp_int.h
    $(cc) -c sgp4sdp4.c
sgp0.o:sgp0.c sgp.h sgp_int.h
    $(cc) -c sgp0.c
sgp_deep.o:sgp_deep.c sgp.h sgp_int.h
    $(cc) -c sgp_deep.c
sgp_conv.o:sgp_conv.c sgp.h sgp_int.h
    $(cc) -c sgp_conv.c
sgp_math.o:sgp_math.c sgp.h sgp_int.h
    $(cc) -c sgp_math.c
sgp_time.o:sgp_time.c sgp.h sgp_int.h
    $(cc) -c sgp_time.c

clean:
    rm -rf kapatest $(objects)


看到了吧,最簡單的Makefile入門就是這樣了,如果你要使用別的編譯器,可以把cc代表的變量換成你要用的編譯器,加上所需相關鏈接庫就可以了。


一起進步,一起加油!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章