1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢(xún)
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
      變量的高級(jí)主題(六)

              我們?cè)谇懊鎸W(xué)習(xí)了 makefile 中的相關(guān)知識(shí),今天我們來(lái)看看在 makefile 中變量值的替換。它的替換是指使用指定字符(串)替換變量值中的后綴字符(串),語(yǔ)法格式為:$(var:a=b) 或 ${var:a=b}。注意:a> 替換表達(dá)式中不能有任何的空格;b> make 中支持使用 ${ } 對(duì)變量進(jìn)行取值。格式如下

      你所需要的網(wǎng)站建設(shè)服務(wù),我們均能行業(yè)靠前的水平為你提供.標(biāo)準(zhǔn)是產(chǎn)品質(zhì)量的保證,主要從事網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站建設(shè)、成都手機(jī)網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、成都品牌網(wǎng)站建設(shè)、網(wǎng)頁(yè)制作、做網(wǎng)站、建網(wǎng)站。創(chuàng)新互聯(lián)擁有實(shí)力堅(jiān)強(qiáng)的技術(shù)研發(fā)團(tuán)隊(duì)及素養(yǎng)的視覺(jué)設(shè)計(jì)專(zhuān)才。

      變量的高級(jí)主題(六)

              還有種便是變量的模式替換是指使用 % 保留變量值中的指定字符,替換其他字符。語(yǔ)法格式為:$(var:a%b=x%y) 或 ${var:a%b=x%y}。注意:a> 替換表達(dá)式中不能有任何的空格;b> make 中支持使用 ${ } 對(duì)變量進(jìn)行取值。格式如下

      變量的高級(jí)主題(六)

              規(guī)則中的模式替換如下

      變量的高級(jí)主題(六)

              它的意義是通過(guò) target-pattern 從 targets 中匹配子目標(biāo);再通過(guò) prereq-pattern 從子目標(biāo)生成依賴(lài);進(jìn)而構(gòu)成完整的規(guī)則。我們來(lái)看看規(guī)則中的模式替換示例如下

      變量的高級(jí)主題(六)

              下來(lái)我們通過(guò)代碼來(lái)分析說(shuō)明

      src1 := a.cc b.cc c.cc
      obj1 := $(src1:cc=o)
      
      test1 :
          @echo "obj1 => $(obj1)"
      
      src2 := a11b.c a22b.c a33b.c
      obj2 := $(src2:a%b.c=x%y)
      
      test2 :
          @echo "obj2 => $(obj2)"

              我們根據(jù)之前說(shuō)的,在 obj1 中將會(huì)把 .cc 替換成  .o,把 obj2 中的 a11b.c a22b.c a33b.c 替換成 x11y x22y x33y。我們來(lái)看看編譯器效果

      變量的高級(jí)主題(六)

              我們看到結(jié)果和我們分析的是一樣的。下來(lái)再來(lái)看看模式替換,將之前的 makefile 進(jìn)行改編

      CC := g++
      TARGET := hello-makefile.out
      OBJS := func.o main.o
      
      $(TARGET) : $(OBJS)
          $(CC) -o $@ $^
      
      $(OBJS) : %.o : %.c
          $(CC) -o $@ -c $^
      
      .PHONY : rebuild clean all
      
      rebuild : clean all
      
      all : $(TARGET)
          
      clean : 
          $(RM) *.o $(TARGET)

              我們來(lái)看看編譯效果和之前的是一樣的嗎?

      變量的高級(jí)主題(六)

              結(jié)果是一樣的,這樣的寫(xiě)的意義在哪呢?在大型的工程項(xiàng)目中,.c源文件是成千上萬(wàn)的。我們就可以利用模式替換來(lái)代替重復(fù)的工作,比如我們想添加一個(gè) const.c 文件,便可以直接在第 3 行直接加上 const.o 就OK了。我們來(lái)試試看

      const.c 源碼

      const char* g_hello = "hello makefile";

      func.c 源碼

      #include "stdio.h"
      
      extern char* g_hello;
      
      void foo()
      {
          printf("void foo() : %s\n", g_hello);
      }

      main.c 源碼

      extern void foo();
      
      int main()
      {
          foo();
          
          return 0;
      }

              我們來(lái)看看編譯效果

      變量的高級(jí)主題(六)

              我們看到在編譯的時(shí)候自動(dòng)加上了編譯 const.c 的命令,并最終正確打印出結(jié)果。這樣感覺(jué)是不是很方便哈。那么在 makefile 中變量值還可以嵌套引用,就是一個(gè)變量名之中可以包含對(duì)其它變量的引用,嵌套引用的本質(zhì)是使用一個(gè)變量來(lái)表示另外一個(gè)變量。格式如下

      變量的高級(jí)主題(六)

              下來(lái)我們來(lái)說(shuō)說(shuō)命令行變量,在運(yùn)行 make 時(shí)直接在命令行定義變量。命令行變量默認(rèn)覆蓋 makefile 中定義的變量,格式如下

      變量的高級(jí)主題(六)

              那么命令行變量可以覆蓋 makefile 中定義的變量,如果我們不小心手誤覆蓋了呢?這時(shí) override關(guān)鍵字就登場(chǎng)了。它是用于指示 makefile 中定義的變量不能被覆蓋,變量的定義個(gè)賦值都需要使用 override 關(guān)鍵字。格式如下

      變量的高級(jí)主題(六)

              下來(lái)我們來(lái)看看 makefile 中的  define關(guān)鍵字,它是用于在 makefile 中定義多行變量,多行變量的定義從變量名開(kāi)始帶 endef 結(jié)束。可使用 override 關(guān)鍵字防止變量被覆蓋,define 定義的變量等價(jià)于使用 = 定義的變量。格式入下

      變量的高級(jí)主題(六)

              下來(lái)我們還是以代碼為例來(lái)進(jìn)行說(shuō)明

      hm := hello makefile
      
      override var := override-test
      
      define foo
      I'm fool!
      endef
      
      override define cmd
          @echo "run cmd ls ..."
          @ls
      endef
      
      test :
          @echo "hm => $(hm)"
          @echo "var => $(var)"
          @echo "foo => $(foo)"
          ${cmd}

              我們來(lái)編譯看看結(jié)果

      變量的高級(jí)主題(六)

              我們看到在沒(méi)有被 override 關(guān)鍵字修飾的變量 hm 可以在命令行對(duì)它進(jìn)行改寫(xiě),但是變量 cmd 因?yàn)楸?override 修飾了,因此就在命令行里面的修改是無(wú)效的。下來(lái)我們還說(shuō)說(shuō) makefile 中的環(huán)境變量(全局變量),在 makefile 中能夠直接使用環(huán)境變量的值。它是在定義了同名變量的話(huà),環(huán)境變量將被覆蓋,運(yùn)行 make 時(shí)指定“-e”選項(xiàng),優(yōu)先使用環(huán)境變量。那么為什么要在 makefile 中使用環(huán)境變量呢?它的優(yōu)勢(shì)是環(huán)境變量可以在所有的 makefile 中使用,劣勢(shì)是過(guò)多的依賴(lài)于環(huán)境變量便會(huì)導(dǎo)致移植性降低。那么變量在不同的 makefile 支架的傳遞方式有哪些呢?a> 直接在外部定義環(huán)境變量進(jìn)行傳遞;b> 使用 export 定義變量進(jìn)行傳遞;c> 定義 make 命令進(jìn)行傳遞(一般推薦使用這種)。

              下來(lái)我們還是以代碼為例來(lái)進(jìn)行分析

      export var := D.T.Software
      new := TDelphi
      
      test :
          @echo "make another file ..."
          @$(MAKE) -f makefile.4
          @$(MAKE) -f makefile.4 new:=$(new)

      makefile.4 源碼

      test :
          @echo "var => $(var)"
          @echo "new => $(new)"

              我們來(lái)看看編譯結(jié)果

      變量的高級(jí)主題(六)

              我們看到在第一次的時(shí)候 new 為空,在第二次的時(shí)候 new 為我們?cè)O(shè)置的字符串。兩次的 var 都傳遞過(guò)去了就是因?yàn)槲覀兪褂昧?export 這個(gè)關(guān)鍵字。下來(lái)我們來(lái)看看目標(biāo)變量(局部變量),其作用域只在指定目標(biāo)及連帶規(guī)則中。格式如下

      變量的高級(jí)主題(六)

              那么模式變量便是目標(biāo)變量的擴(kuò)展,其作用域只在符合模式的目標(biāo)及連帶規(guī)則中。格式如下

      變量的高級(jí)主題(六)

              下來(lái)還是以代碼為例來(lái)進(jìn)行分析說(shuō)明

      var := D.T.Software
      new := TDelphi
      
      test : var := test-var
      %e : override new := test-new
      
      test : another
          @echo "test :"
          @echo "var => $(var)"
          @echo "new => $(new)"
      
      another :
          @echo "another :"
          @echo "var => $(var)"
          @echo "new => $(new)"
      
      rule :
          @echo "rule :"
          @echo "var => $(var)"
          @echo "new => $(new)"

              我們來(lái)看看編譯結(jié)果

      變量的高級(jí)主題(六)

              因?yàn)?%e 的匹配規(guī)則,所以在目標(biāo) rule 中,它的 new 為 test-new,凡是跟 test 目標(biāo)相關(guān)的 var 都是 test-var。通過(guò)對(duì) makefile 中變量的學(xué)習(xí),總結(jié)如下:1、makefile 中的變量值能夠嵌套引用;2、命令行中定義的變量能夠覆蓋 makefile 中定義的變量;3、override 用于提示 makefile 中定義的變量不能被覆蓋;4、define 用于在 makefile 中定義值為多行的變量;5、makefile 中的三種變量:a> 全局變量是指 makefile 外部定義的環(huán)境變量;b> 文件變量是在 makefile 中定義的變量;c> 局部變量是指定目標(biāo)的變量。

               歡迎大家一起來(lái)學(xué)習(xí) makefile,可以加我QQ:243343083。


      當(dāng)前標(biāo)題:變量的高級(jí)主題(六)
      URL標(biāo)題:http://www.ef60e0e.cn/article/gejshg.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        祁门县| 昆山市| 陵水| 开封县| 正镶白旗| 磐安县| 保靖县| 高唐县| 延寿县| 黄浦区| 襄垣县| 太保市| 荔波县| 论坛| 福海县| 玛沁县| 西乌| 鄱阳县| 莫力| 湘潭县| 鸡东县| 凭祥市| 巴青县| 会同县| 伊川县| 米林县| 邛崃市| 沁水县| 湘潭县| 名山县| 沂水县| 阜新| 砀山县| 凉城县| 尼玛县| 汉川市| 南丰县| 鹤岗市| 海南省| 宜宾县| 昌平区|