日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

如何寫 makefile文件

 danydany_ok 2011-01-12

如何寫 makefile文件 收藏

如何寫 makefile文件

學(xué)習(xí)別人的程序就面臨著重寫makefile的問題.下面以問答的形式來解釋如何寫makefile文件.

1.makefile的核心:

    target...(目標(biāo)文件|object文件|可執(zhí)行文件|標(biāo)簽)  : prerequisites( 生成target所需要的文件,也可以是target中的一種...)

       Command (shell 命令)

    

    target這一個或多個的目標(biāo)文件依賴于prerequisites中的文件,其生成規(guī)則定義在command中。prerequisites中如果有一個以上的文件比target文件更新的話,command所定義的命令就會執(zhí)行。

         

2.make 的工作原理:

    例, 文件名:makefiletest

    test : test.o

       gcc -o test test.o

    test.o: test.h test.c

       gcc -c test.c

    clean:

       rm test.o test

在默認(rèn)方式下,只輸入make命令。其會做如下工作:

make會在當(dāng)前目錄下找名字為“Makefile文件”或“makefile文件”的文件。如果找到,它會找文件中的第一個目標(biāo)文件 (target)。在上面的例子中,它會找到makefiletest這個文件,并把test作為最終的目標(biāo)文件;如果test文件不存在,或是test 所依賴的后面的 .o 文件的修改時間要比test這個文件新,它就會執(zhí)行后面所定義的命令來生成test文件。

如果test所依賴的.o文件也存在,make會在當(dāng)前文件中找目標(biāo)為.o文件的依賴性,如果找到,則會根據(jù)規(guī)則生成.o文件(這有點(diǎn)像一個堆棧的過程)。

當(dāng)然,C文件和H文件如果存在,make會生成 .o 文件,然后再用 .o 文件生成make的最終結(jié)果,也就是執(zhí)行文件test。

    這就是整個make的依賴性,make會一層又一層地去找文件的依賴關(guān)系,直到最終編譯出第一個目標(biāo)文件。在找尋的過程中,如果出現(xiàn)錯誤,比如最后被依 賴的文件找不到,make就會直接退出,并報錯。而對于所定義的命令的錯誤,或是編譯不成功,make就不會處理。如果在make找到了依賴關(guān)系之后,冒 號后面的文件不存在,make仍不工作

通過上述分析,可以看出像clean這樣沒有被第一個目標(biāo)文件直接或間接關(guān)聯(lián)時,它后面所定義的命令將不會被自動執(zhí)行,不過,可以顯式使make執(zhí)行。即使用命令make clean,以此來清除所有的目標(biāo)文件,并重新編譯。

在編程中,如果這個工程已被編譯過了,當(dāng)修改了其中一個源文件時,比如test.c,根據(jù)依賴性,目標(biāo)test.o會被重新編譯(也就是在這個依賴 性關(guān)系后面所定義的命令),則test.o文件也是最新的,即test.o文件的修改時間要比test要新,所以test也會被重新連接了。

3 定義變量:

    ltest=test.h test.c

    上面的makefiletest可以改寫為:

       test : test.o

       gcc -o test test.o

    test.o: $(ltest)

       gcc -c test.c

    clean:

       rm test.o test

4 makefile文件的自動推導(dǎo)

    test : test.o

       gcc -o test test.o

    test.o: test.h

    clean:

       rm test.o test

看一下test.o這個target,省略了 prerequisites的 test.c和command的gcc -c test.c,這些是target為test.o能推導(dǎo)出來的.

5 清空目標(biāo)文件

    .PHONY : clean

        clean :

                -rm test.o test

    前面說過,.PHONY表示clean是一個“偽目標(biāo)”,而在rm命令前面加了一個小減號的目的是,如果某些文    件出現(xiàn)問題將被忽略,繼續(xù)進(jìn)行后面的操作。當(dāng)然,clean的規(guī)則不要放在文件的開頭,否則會變成make的    默認(rèn)目標(biāo)。不成文的規(guī)矩是“clean從來都放在文件的最后”

6.注釋:

 #. 為行注釋,與//類似

7.顯示指定makefile文件名

    將makefiletest改為make.test

    make -f make.test

8.TAB鍵

    為command命令的識別鍵,在command頭使用,最好不要用在其它地方

9.包含 其它 makefile文件

    include <filename>

filename可以是當(dāng)前操作系統(tǒng)Shell的文件模式(可以保含路徑和通配符)。在include前面可以有一些空字符,但是絕不能以 [Tab]鍵開始。include和<filename>可以用一個或多個空格隔開。舉個例子,有這樣幾個makefile文件:a.mk、 b.mk、c.mk,還有一個文件叫foo.make,以及一個變量$(bar),其包含了e.mk和f.mk,下面的語句:

include foo.make *.mk $(bar)

等價于:

include foo.make a.mk b.mk c.mk e.mk f.mk

10 -include和sinclude 都可以ignore error,

11. make的工作順序

(1) 讀入所有的makefile文件。

(2) 讀入被include包括的其他makefile文件。

(3) 初始化文件中的變量。

(4) 推導(dǎo)隱式規(guī)則,并分析所有規(guī)則。

(5) 為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈。

(6) 根據(jù)依賴關(guān)系,決定哪些目標(biāo)要重新生成。

(7) 執(zhí)行生成命令。

12.轉(zhuǎn)義字符與通配符

    /

    *,?,[...],~

其它請參見用戶手冊.


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多