青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

八、自動生成依賴性

在Makefile中,我們的依賴關(guān)系可能會需要包含一系列的頭文件,比如,如果我們的main.c中有一句“#include "defs.h"”,那么我們的依賴關(guān)系應(yīng)該是:

    main.o : main.c defs.h

但是,如果是一個比較大型的工程,你必需清楚哪些C文件包含了哪些頭文件,并且,你在加入或刪除頭文件時,也需要小心地修改Makefile,這是一個很沒有維護性的工作。為了避免這種繁重而又容易出錯的事情,我們可以使用C/C++編譯的一個功能。大多數(shù)的C/C++編譯器都支持一個“-M”的選項,即自動找尋源文件中包含的頭文件,并生成一個依賴關(guān)系。例如,如果我們執(zhí)行下面的命令:

    cc -M main.c

其輸出是:

    main.o : main.c defs.h

于是由編譯器自動生成的依賴關(guān)系,這樣一來,你就不必再手動書寫若干文件的依賴關(guān)系,而由編譯器自動生成了。需要提醒一句的是,如果你使用GNU的C/C++編譯器,你得用“-MM”參數(shù),不然,“-M”參數(shù)會把一些標(biāo)準(zhǔn)庫的頭文件也包含進來。

    gcc -M main.c的輸出是:

    main.o: main.c defs.h /usr/include/stdio.h /usr/include/features.h \
         /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
         /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \
         /usr/include/bits/types.h /usr/include/bits/pthreadtypes.h \
         /usr/include/bits/sched.h /usr/include/libio.h \
         /usr/include/_G_config.h /usr/include/wchar.h \
         /usr/include/bits/wchar.h /usr/include/gconv.h \
         /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \
         /usr/include/bits/stdio_lim.h


    gcc -MM main.c的輸出則是:

    main.o: main.c defs.h

那么,編譯器的這個功能如何與我們的Makefile聯(lián)系在一起呢。因為這樣一來,我們的Makefile也要根據(jù)這些源文件重新生成,讓Makefile自已依賴于源文件?這個功能并不現(xiàn)實,不過我們可以有其它手段來迂回地實現(xiàn)這一功能。GNU組織建議把編譯器為每一個源文件的自動生成的依賴關(guān)系放到一個文件中,為每一個“name.c”的文件都生成一個“name.d”的Makefile文件,[.d]文件中就存放對應(yīng)[.c]文件的依賴關(guān)系。

于是,我們可以寫出[.c]文件和[.d]文件的依賴關(guān)系,并讓make自動更新或自成[.d]文件,并把其包含在我們的主Makefile中,這樣,我們就可以自動化地生成每個文件的依賴關(guān)系了。

這里,我們給出了一個模式規(guī)則來產(chǎn)生[.d]文件:

    %.d: %.c
            @set -e; rm -f $@; \
             $(CC) -M $(CPPFLAGS) $< >; $@.$$$$; \
             sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ >; $@; \
             rm -f $@.$$$$


這個規(guī)則的意思是,所有的[.d]文件依賴于[.c]文件,“rm -f $@”的意思是刪除所有的目標(biāo),也就是[.d]文件,第二行的意思是,為每個依賴文件“$<”,也就是[.c]文件生成依賴文件,“$@”表示模式“%.d”文件,如果有一個C文件是name.c,那么“%”就是“name”,“$$$$”意為一個隨機編號,第二行生成的文件有可能是“name.d.12345”,第三行使用sed命令做了一個替換,關(guān)于sed命令的用法請參看相關(guān)的使用文檔。第四行就是刪除臨時文件。

總而言之,這個模式要做的事就是在編譯器生成的依賴關(guān)系中加入[.d]文件的依賴,即把依賴關(guān)系:

    main.o : main.c defs.h

轉(zhuǎn)成:

    main.o main.d : main.c defs.h

于是,我們的[.d]文件也會自動更新了,并會自動生成了,當(dāng)然,你還可以在這個[.d]文件中加入的不只是依賴關(guān)系,包括生成的命令也可一并加入,讓每個[.d]文件都包含一個完賴的規(guī)則。一旦我們完成這個工作,接下來,我們就要把這些自動生成的規(guī)則放進我們的主Makefile中。我們可以使用Makefile的“include”命令,來引入別的Makefile文件(前面講過),例如:

    sources = foo.c bar.c

    include $(sources:.c=.d)

上述語句中的“$(sources:.c=.d)”中的“.c=.d”的意思是做一個替換,把變量$(sources)所有[.c]的字串都替換成[.d],關(guān)于這個“替換”的內(nèi)容,在后面我會有更為詳細的講述。當(dāng)然,你得注意次序,因為include是按次來載入文件,最先載入的[.d]文件中的目標(biāo)會成為默認目標(biāo)。
Posted on 2007-04-17 11:01 艾凡赫 閱讀(2338) 評論(0)  編輯 收藏 引用 所屬分類: C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲人成久久| 亚洲欧美日韩国产中文 | 欧美成人亚洲| 日韩视频亚洲视频| 亚洲欧美综合精品久久成人| 欧美视频一区二区三区四区| 久热精品视频在线观看一区| 欧美激情亚洲自拍| 欧美日韩ab| 亚洲精品美女免费| 国产日韩精品一区二区浪潮av| 久久综合久久久| 国产日韩一区二区三区| 亚洲欧美美女| 久久久精品国产免费观看同学| 亚洲国产精品久久| 新狼窝色av性久久久久久| 性亚洲最疯狂xxxx高清| 精品88久久久久88久久久| 久久伊人亚洲| 亚洲人成小说网站色在线| 亚洲婷婷免费| 一本综合久久| 久久看片网站| 午夜在线视频观看日韩17c| 久久久久这里只有精品| 亚洲欧美日韩精品在线| 美女日韩欧美| 久久女同互慰一区二区三区| 欧美日韩视频第一区| 欧美激情一区在线观看| 国内成+人亚洲| 亚洲一区二区日本| 艳妇臀荡乳欲伦亚洲一区| 久久天堂精品| 久久精品99久久香蕉国产色戒 | 国产精品专区第二| 亚洲精品欧洲| 亚洲国产精品一区制服丝袜 | 亚洲一区二区3| 欧美第十八页| 欧美成人激情视频| 国内精品模特av私拍在线观看| 一区二区三区视频在线| aⅴ色国产欧美| 欧美激情一区二区三区不卡| 欧美成人情趣视频| 在线精品视频在线观看高清| 欧美在线在线| 久久精品久久99精品久久| 国产精品久久久久毛片软件| av成人免费在线| 亚洲视频999| 欧美国产一区二区| 亚洲大胆女人| 亚洲韩国精品一区| 久久婷婷综合激情| 欧美高清视频免费观看| 在线免费观看日本一区| 久久字幕精品一区| 亚洲国产一区二区精品专区| 欧美日韩成人精品| 亚洲天堂成人在线观看| 亚洲欧美日韩另类| 久久这里有精品视频| 亚洲国产一区二区a毛片| 亚洲国产视频a| 免费的成人av| 欧美一区三区三区高中清蜜桃| 国产精品一区二区视频| 校园激情久久| 在线观看欧美成人| 久久国产精品亚洲77777| 久热re这里精品视频在线6| 伊人春色精品| 欧美国产综合| 亚洲深夜av| 久久精品视频网| 在线日韩av片| 欧美日韩在线免费| 欧美+亚洲+精品+三区| 久久国产精品99国产精| 欧美国产精品劲爆| 国产综合一区二区| 亚洲国产精品va在看黑人| 久久精品99久久香蕉国产色戒| 国产一区二区三区高清在线观看| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美激情一区二区久久久| 久久久.com| 国产午夜久久久久| 欧美国产综合| 欧美激情在线播放| 国产精品成人免费精品自在线观看| 国产欧美欧美| 一区二区三区日韩在线观看| 亚洲欧美日韩在线| 亚洲无线一线二线三线区别av| 欧美在线高清| 亚洲女人天堂av| 亚洲国产欧美一区二区三区同亚洲 | 欧美一区二区三区在线观看视频| 久久午夜视频| 在线视频精品| 久久福利视频导航| 一区二区亚洲| 性色av一区二区三区在线观看| 欧美日韩在线看| 亚洲图片欧美日产| 亚洲欧美日韩一区在线| 亚洲第一页中文字幕| 久久青草欧美一区二区三区| 免费欧美网站| 欧美v日韩v国产v| 国产伦理精品不卡| 免费一级欧美片在线观看| 久久久久五月天| 一区二区三区国产在线| 欧美顶级艳妇交换群宴| 欧美一区二区高清| 99在线精品观看| 国产一区二区三区久久久| 久久中文精品| 国产精品久久夜| 亚洲一区二区三区色| 一本久久a久久免费精品不卡| 免费在线播放第一区高清av| 亚洲一区二区三区四区中文| 久久久久久久久岛国免费| 国产精品亚洲综合色区韩国| 欧美成人蜜桃| 欧美激情精品久久久久久变态| 亚洲欧洲日韩在线| 欧美另类综合| 欧美精品一区三区| 亚洲欧美日本日韩| 亚洲夜晚福利在线观看| 欧美成人亚洲成人| 欧美aⅴ99久久黑人专区| 亚洲女优在线| 亚洲综合清纯丝袜自拍| 亚洲激情欧美| 亚洲人午夜精品免费| 国外成人在线| 国产日韩视频| 欧美成人午夜| 欧美激情女人20p| 欧美精品国产一区| 免费黄网站欧美| 理论片一区二区在线| 欧美尤物一区| 久久全球大尺度高清视频| 亚洲在线1234| 久久狠狠一本精品综合网| 亚洲女性喷水在线观看一区| 午夜综合激情| 午夜天堂精品久久久久| 午夜精品99久久免费| 亚洲一区一卡| 亚洲自拍偷拍麻豆| 亚洲欧美在线一区二区| 亚洲综合色网站| 亚洲日本成人| 亚洲美女在线视频| 亚洲免费大片| 最近中文字幕日韩精品| 99这里有精品| 午夜精品区一区二区三| 亚洲欧美一区二区激情| 欧美一区二视频| 久久精品国产亚洲高清剧情介绍| 99精品欧美一区二区三区| 99精品99| 亚洲综合色噜噜狠狠| 另类亚洲自拍| 久久久久久亚洲综合影院红桃 | 老**午夜毛片一区二区三区| 亚洲高清视频在线| 欧美日韩国产美| 欧美激情一二三区| 国产一区日韩一区| 国产亚洲福利一区| 99国产一区二区三精品乱码| 亚洲第一天堂无码专区| 亚洲精品国产视频| 欧美一级片一区| 欧美成人午夜激情在线| 这里只有精品丝袜| 欧美亚洲一区二区在线| 欧美日韩aaaaa| 国产精品入口66mio| 亚洲韩国精品一区| 国产精品国产福利国产秒拍| 国产欧美日本在线| 一级日韩一区在线观看| 欧美一区二区观看视频| 亚洲人成毛片在线播放| 亚洲一区二区高清视频| 欧美1区3d| 国产精品区一区|