• <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>
            六、多目標

            Makefile的規則中的目標可以不止一個,其支持多目標,有可能我們的多個目標同時依賴于一個文件,并且其生成的命令大體類似。于是我們就能把其合并起來。當然,多個目標的生成規則的執行命令是同一個,這可能會可我們帶來麻煩,不過好在我們的可以使用一個自動化變量“$@”(關于自動化變量,將在后面講述),這個變量表示著目前規則中所有的目標的集合,這樣說可能很抽象,還是看一個例子吧。

                bigoutput littleoutput : text.g
                        generate text.g -$(subst output,,$@) >; $@

                上述規則等價于:

                bigoutput : text.g
                        generate text.g -big >; bigoutput
                littleoutput : text.g
                        generate text.g -little >; littleoutput

                其中,-$(subst output,,$@)中的“$”表示執行一個Makefile的函數,函數名為subst,后面的為參數。關于函數,將在后面講述。這里的這個函數是截取字符串的意思,“$@”表示目標的集合,就像一個數組,“$@”依次取出目標,并執于命令。


            七、靜態模式

            靜態模式可以更加容易地定義多目標的規則,可以讓我們的規則變得更加的有彈性和靈活。我們還是先來看一下語法:

                <targets ...>;: <target-pattern>;: <prereq-patterns ...>;
                        <commands>;
                        ...


                targets定義了一系列的目標文件,可以有通配符。是目標的一個集合。

                target-parrtern是指明了targets的模式,也就是的目標集模式。

                prereq-parrterns是目標的依賴模式,它對target-parrtern形成的模式再進行一次依賴目標的定義。

            這樣描述這三個東西,可能還是沒有說清楚,還是舉個例子來說明一下吧。如果我們的<target-parrtern>;定義成“%.o”,意思是我們的<target>;集合中都是以“.o”結尾的,而如果我們的<prereq-parrterns>;定義成“%.c”,意思是對<target-parrtern>;所形成的目標集進行二次定義,其計算方法是,取<target-parrtern>;模式中的“%”(也就是去掉了[.o]這個結尾),并為其加上[.c]這個結尾,形成的新集合。

            所以,我們的“目標模式”或是“依賴模式”中都應該有“%”這個字符,如果你的文件名中有“%”那么你可以使用反斜杠“\”進行轉義,來標明真實的“%”字符。

            看一個例子:

                objects = foo.o bar.o

                all: $(objects)

                $(objects): %.o: %.c
                        $(CC) -c $(CFLAGS) $< -o $@


            上面的例子中,指明了我們的目標從$object中獲取,“%.o”表明要所有以“.o”結尾的目標,也就是“foo.o bar.o”,也就是變量$object集合的模式,而依賴模式“%.c”則取模式“%.o”的“%”,也就是“foo bar”,并為其加下“.c”的后綴,于是,我們的依賴目標就是“foo.c bar.c”。而命令中的“$<”和“$@”則是自動化變量,“$<”表示所有的依賴目標集(也就是“foo.c bar.c”),“$@”表示目標集(也就是“foo.o bar.o”)。于是,上面的規則展開后等價于下面的規則:

                foo.o : foo.c
                        $(CC) -c $(CFLAGS) foo.c -o foo.o
                bar.o : bar.c
                        $(CC) -c $(CFLAGS) bar.c -o bar.o

            試想,如果我們的“%.o”有幾百個,那種我們只要用這種很簡單的“靜態模式規則”就可以寫完一堆規則,實在是太有效率了。“靜態模式規則”的用法很靈活,如果用得好,那會一個很強大的功能。再看一個例子:


                files = foo.elc bar.o lose.o

                $(filter %.o,$(files)): %.o: %.c
                        $(CC) -c $(CFLAGS) $< -o $@
                $(filter %.elc,$(files)): %.elc: %.el
                        emacs -f batch-byte-compile $<


            $(filter %.o,$(files))表示調用Makefile的filter函數,過濾“$filter”集,只要其中模式為“%.o”的內容。其的它內容,我就不用多說了吧。這個例字展示了Makefile中更大的彈性。
            Posted on 2007-04-17 11:00 艾凡赫 閱讀(3383) 評論(0)  編輯 收藏 引用 所屬分類: C++
            日本久久久久亚洲中字幕| 日韩精品久久无码人妻中文字幕 | 久久99亚洲综合精品首页| 国产91久久精品一区二区| 久久综合狠狠综合久久激情 | 久久久久亚洲AV成人网人人网站| 久久99精品久久久大学生| 国产婷婷成人久久Av免费高清| 国产激情久久久久影院老熟女免费 | 久久国产免费直播| 亚洲午夜精品久久久久久人妖| 亚洲国产精品无码久久青草| 亚洲精品乱码久久久久久久久久久久 | 亚洲精品国产字幕久久不卡| 久久青青草原亚洲av无码app| 丁香五月综合久久激情| 国产69精品久久久久APP下载| 久久99中文字幕久久| 国产A三级久久精品| 久久狠狠一本精品综合网| 久久精品aⅴ无码中文字字幕不卡| segui久久国产精品| 精品久久久久久无码专区| 亚洲一级Av无码毛片久久精品| 久久精品男人影院| 精品久久无码中文字幕| 久久精品国产AV一区二区三区| 色婷婷久久综合中文久久一本| 狠狠色丁香婷婷综合久久来| 亚洲国产精品久久久天堂| 久久只有这精品99| 97精品依人久久久大香线蕉97 | 久久久久国产精品人妻| 亚洲精品综合久久| 久久亚洲中文字幕精品一区| 国产精品无码久久久久| 韩国三级大全久久网站| 国产一级做a爰片久久毛片| 国产精品美女久久久| 色综合色天天久久婷婷基地| 2021国产成人精品久久|