<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    選擇java 進(jìn)入自由開放的國(guó)度

    隨筆 - 49, 文章 - 3, 評(píng)論 - 154, 引用 - 1
    數(shù)據(jù)加載中……

    Makefile文件編寫

    開始使用Linux編程時(shí),一個(gè)很討厭的問題就是如何寫Makefile文件,由于在Linux下不像在Windows下那么熟悉,有那么多好的軟件(也許是對(duì)Linux孤陋寡聞了)。雖然象KylixAnjuta這樣的集成編譯環(huán)境,但是Kylix太大太慢,用它編寫console程序不亞于高射炮打蚊子——大材小用,而Anjuta又太不穩(wěn)定,況且字體有那么難看。不說了,還是言歸正傳,看看Makefile該如何編寫。


    1. 簡(jiǎn)單的GCC語法:

    如果你只有一個(gè)文件(或者只有幾個(gè)文件),那么就可以不寫Makefile文件(當(dāng)然有Makefile更加方便),用gcc直接編譯就行了。在這里我們只介紹幾個(gè)我經(jīng)常用的幾個(gè)參數(shù),第一是 “-o”,它后面的參數(shù)表示要輸出的目標(biāo)文件,再一個(gè)是 “-c”,表示僅編譯(Compile),不連接(Make),如果沒有”-c”參數(shù),那么就表示連接,如下面的幾個(gè)命令:

    gcc –c test.c,表示只編譯test.c文件,成功時(shí)輸出目標(biāo)文件test.o

    gcc –c test.c –o test.o ,與上一條命令完全相同

    gcc –o test test.o,將test.o連接成可執(zhí)行的二進(jìn)制文件test

    gcc –o test test.c,將test.c編譯并連接成可執(zhí)行的二進(jìn)制文件test

    gcc test.c –o test,與上一條命令相同

    gcc –c test1.c,只編譯test1.c,成功時(shí)輸出目標(biāo)文件test1.o

    gcc –c test2.c,只編譯test2.c,成功時(shí)輸出目標(biāo)文件test2.o

    gcc –o test test1.o test2.o,將test1.otest2.o連接為可執(zhí)行的二進(jìn)制文件test

    gcc –c test test1.c test2.c,將test1.otest2.o編譯并連接為可執(zhí)行的二進(jìn)制文件test

    注:如果你想編譯cpp文件,那么請(qǐng)用g++,否則會(huì)有類似如下莫名其妙的錯(cuò)誤:

    cc3r3i2U.o(.eh_frame+0x12): undefined reference to `__gxx_personality_v0’......

    還有一個(gè)參數(shù)是”-l”參數(shù),與之緊緊相連的是表示連接時(shí)所要的鏈接庫,比如多線程,如果你使用了pthread_create函數(shù),那么你就應(yīng)該在編譯語句的最后加上”-lpthread””-l”表示連接,”pthread”表示要連接的庫,注意他們?cè)谶@里要連在一起寫,還有比如你使用了光標(biāo)庫curses,那么呢就應(yīng)該在后面加上”-lcurses”,比如下面的寫法:

    gcc –o test test1.o test2.o –lpthread –lcurses

    當(dāng)然gcc的參數(shù)我感覺有幾百個(gè),不過我們平時(shí)在x86機(jī)器上用的就這么些,況且這里也不是GCC教程,所以,就此打住。

    2. Makefile基本語法

    我這里沒有Makefile的詳細(xì)設(shè)計(jì)書,只是憑著看別人的Makefile文件和一些網(wǎng)上的參考資料,作一些簡(jiǎn)單的介紹(我自己理解的,不對(duì)的地方還請(qǐng)各位老大們指出,鄙人將不甚感激)

    2.1 目標(biāo):

    大家在看別人使用Makefile文件時(shí)肯定經(jīng)常見到有的人常用make all, make install, make clean等命令,同樣只有一個(gè)Makefile文件,那么allinstallclean參數(shù)是如何控制Makefile文件的運(yùn)行呢(這句話有問題,但我不知道該怎么說,大家能看懂我的意思,就放我一馬吧)?在這里,如果向上面的命令如果能夠正確運(yùn)行的話,那么在Makefile文件里一定有這樣的幾行,他們的開始一定是

    all: ×××××××

           ×××××××××××

    install: ××××××

           ×××××××××××

    clean: ×××××××××

            ×××××××××××

    當(dāng)然也不盡然,因?yàn)?/SPAN>allinstallclean我們可以用其他的變量來代替,但是著了我們就簡(jiǎn)單起見,就下定論了,各位別怪。

    在上面提到的allinstallclean等就是我們所說的目標(biāo)。make all命令,就告訴make我們將執(zhí)行all所指定的目標(biāo)。為了便于理解Make程序的流程,我們給大家看一個(gè)與gcc毫無關(guān)系的Makefile文件:

    # #表示Makefile文件中的注釋,下面是Makefile文件的具體內(nèi)容

    all:

            @echo you have typed command “make all”

    clean:

            @echo you have typed command “make clean”

    install:

            @ehco you have typed command “make $@

    #Makefile文件結(jié)束

    注意在這里,all:clean:install:行要頂格些,而所有的@echo前要加tab鍵來跳格縮進(jìn)。下面是運(yùn)行結(jié)果:

    [root@xxx test]#cat Makefile

    # #表示Makefile文件中的注釋,下面是Makefile文件的具體內(nèi)容

    all:

            @echo you have typed command “make all”

    clean:

            @echo you have typed command “make clean”

    install:

            @ehco you have typed command “make $@

    [root@xxx test]#make all

    you have typed command “make all”

    [root@xxx test]#make clean

    you have typed command “make clean”

    [root@xxx test]#make install

    you have typed command “make install

    [root@xxx test]#

    不知大家注意到?jīng)]有,我們?cè)?/SPAN>Makefile文件里有一個(gè)符號(hào)$@,其中$表示變量名,其后的要當(dāng)作變量來解釋,$@Makefile預(yù)先定義的一個(gè)變量,表示目標(biāo)命令,比如在上面的文件里屬于install目標(biāo),那么$@就表示install,同樣,如果你將clean目標(biāo)下面的加引號(hào)的”make clean”換為:”make $@”,那么命令make clean的輸出與原來是一摸一樣的。大家可以下來試試。

    2.2 依賴

    我們現(xiàn)在提出這樣一個(gè)問題:我如何用一個(gè)make命令將替代所有的make all make installmake clean命令呢?當(dāng)然我們可以象剛才那樣寫一個(gè)Makefile文件:

    [root@xxx test]#cat Makefile

    # #表示Makefile文件中的注釋,下面是Makefile文件的具體內(nèi)容

    all:

            @echo you have typed command “make all”

    clean:

            @echo you have typed command “make clean”

    install:

            @ehco you have typed command “make $@

    doall:

            @echo you have typed command “make $@l”

            @echo you have typed command “make all”

            @echo you have typed command “make clean”

           @ehco you have typed command “make install

    [root@xxx test]#make doall

    you have typed command “make doall

    you have typed command “make all”

    you have typed command “make clean”

    you have typed command “make install

    [root@xxx test]#

    在這里,doall:目標(biāo)有4調(diào)語句,他們都是連在一起并都是由tab鍵開始的。當(dāng)然,這樣能夠完成任務(wù),但是太笨了,我們這樣來寫:

    [root@xxx test]#cat Makefile

    # #表示Makefile文件中的注釋,下面是Makefile文件的具體內(nèi)容

    all:

            @echo you have typed command “make all”

    clean:

            @echo you have typed command “make clean”

    install:

            @ehco you have typed command “make $@

    doall: all clean install

            @echo you have typed command “make $@l”

    [root@xxx test]#make doall

    you have typed command “make all”

    you have typed command “make clean”

    you have typed command “make install

    you have typed command “make doall

    [root@xxx test]#

    相信大家已經(jīng)看清了doall:的運(yùn)行方式,它先運(yùn)行all目標(biāo),然后運(yùn)行clean目標(biāo),然后是install,最后是自己本身的目標(biāo),并且每個(gè)$@還是保持著各自的目標(biāo)名稱。

    在這里,我們稱all, clean, install為目標(biāo)doall所依賴的目標(biāo),簡(jiǎn)稱為doall的依賴。也就是你要執(zhí)行doall,請(qǐng)先執(zhí)行他們(all, clean, install),最后在執(zhí)行我的代碼。

    注意依賴一定是Makefile里面的目標(biāo),否則你非要運(yùn)行,結(jié)局是注定的:

    [root@xxx test]#cat Makefile

    all:

            @echo you have typed command “make all”

    xxx: all WAHAHA:

    [root@xxx test]make xxx

    you have typed command “make all”

    make: *** No rule to make target ‘WAHAHA’, needed by `xxx’,  Stop.

    【輕松一下】我們能否利于“相互依賴”來作弄一下make

    [root@xxx test]#cat Makefile

    tar1: tar2

    tar2: tar1

            @echo this line cann’t be shown on you screen!

    [root@xxx test]make tar1

    make: Circular tar2 <- tar1 dependency dropped.

    呵呵,騙不了的

    3.實(shí)戰(zhàn):

    有了上面的說明,我們就可以開始寫一些弱智一些地Makefile文件了。比如我們有如下的文件:

    tmp/

       +---- include/

       |      +---- f1.h

       |      +----f2.h

       +----f1.c

       +----f2.c

       +---main.c

    其中f1.c#include “include/f1.h”f2.c#include”include/f2.h”main.c中又#include”include/f1.h”, #include”include/f2.h”,主函數(shù)在main.c中,要將他們聯(lián)合起來編譯為目標(biāo)為testmf的文件,我們就可以按下面的方式寫(當(dāng)然是弱智的):

    [root@xxx test]#cat Makefile

    main: main.o f1.o f2.o

            gcc –o testmf main.o f1.o f2.o

    f1.o: f1.c

            gcc –c –o file1.o file1.c

    f2.o: f2.c

            gcc –c –o file2.o file2.c

    main.o

            gcc –c –o main.o main.c

    clean:

            rm –rf f1.o f2.o main.o testmf

    [root@xxx test]make

    gcc –c –o main.o main.c

    gcc –c –o file1.o file1.c

    gcc –c –o file2.o file2.c

    gcc –o testmf main.o f1.o f2.o

    [root@xxx test]ls

    f1.c f1.o f2.c f2.o main.c main.o include/ testmf

    如果你的程序沒有問題的話,就應(yīng)該可以執(zhí)行了./testmf

    大家可能發(fā)現(xiàn)問題了:對(duì)目標(biāo)文件f1.o f2.omain.o,他們的寫法是如此的類似,我們能夠?qū)⑺麄円粔K寫?有的,不過今天沒時(shí)間了,以后再寫吧。

    posted on 2006-03-09 19:23 soochow_hhb 以java論成敗 以架構(gòu)論英雄 閱讀(1529) 評(píng)論(1)  編輯  收藏 所屬分類: Reading

    評(píng)論

    # re: Makefile文件編寫  回復(fù)  更多評(píng)論   

    怎么沒有下文了?
    2006-09-11 15:31 | 仲啟
    主站蜘蛛池模板: 国产亚洲av人片在线观看| 好猛好深好爽好硬免费视频| 亚洲中文字幕无码中文字在线| 免费毛片在线看片免费丝瓜视频| 97人妻精品全国免费视频| 高潮毛片无遮挡高清免费| 中文字幕在线日亚洲9| 亚洲成A人片在线观看WWW| 亚洲国产精品一区二区三区久久| 和日本免费不卡在线v| 日本一道本不卡免费| 91精品成人免费国产| 一级做性色a爰片久久毛片免费| 亚洲大码熟女在线观看| 亚洲国产精品综合久久20| 久久丫精品国产亚洲av不卡| 亚洲欧洲自拍拍偷午夜色无码| 亚洲精品A在线观看| va亚洲va日韩不卡在线观看| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 日本免费中文字幕在线看| 成年人在线免费观看| 岛国片在线免费观看| 操美女视频免费网站| 丁香花免费完整高清观看| 麻豆最新国产剧情AV原创免费| 美丽的姑娘免费观看在线播放| 99精品免费观看| 最近免费视频中文字幕大全| 亚洲精品免费在线观看| 午夜免费福利小电影| 精品无码人妻一区二区免费蜜桃 | 久久久青草青青国产亚洲免观 | 亚洲阿v天堂在线2017免费 | 丝袜熟女国偷自产中文字幕亚洲| 亚洲国产精品专区在线观看 | 久久国产乱子伦精品免费午夜| 有色视频在线观看免费高清在线直播| 色屁屁在线观看视频免费| 农村寡妇一级毛片免费看视频| 四虎精品成人免费视频|