日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Makefile 自动产生依赖

發(fā)布時間:2025/3/20 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Makefile 自动产生依赖 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

代碼如下:

makefile 代碼:
  • 1?%.d:?%.c??
  • ??
  • 2?????????$(CC)?-M?$(CPPFLAGS)?$<?>?$@.$$$$;?\??
  • ??
  • 3?????????sed?'s,\($*\)\.o[?:]*,\1.o?$@?:?,g'?<?$@.$$$$?>?$@;?\??
  • ??
  • 4?????????rm?-f?$@.$$$$??
  • ?

    其實(shí)這里主要是為每個C文件建立一個同名的后綴為.d。該文件的作用是使用gcc的-M屬性來自動生成.o文件的頭文件依賴關(guān)系。

    ?

    第1,2,4都好理解。

    第2行解釋: 使用gcc -M 的屬性將? $<(第1行的第一個依賴文件,就是%.c。 查看靜態(tài)模式)的C文件的依賴關(guān)系輸出到一個臨時文件。? 這里有點(diǎn)疑惑。? 書里面說?? .$$$$是當(dāng)前進(jìn)程好。?? 然到Makefile這個腳本將$$$$當(dāng)成進(jìn)程號了。姑且這么認(rèn)為吧。

    第4行解釋:將第2行產(chǎn)生的臨時文件刪除。

    ?

    ?

    對于第3行, 我知道sed的s命令是一個替換命令。但是里面的用到了太多高深的匹配規(guī)則了。? sed命令果真如傳聞中的那么強(qiáng)大,對于現(xiàn)在的我來說還真的很陌生。不管咋樣, 要把它解決。

    ?

    首先,我們先要知道sed是什么概念。

    sed是一個非交互式的流編輯器。所謂非交互式,是指使用sed只能在命令行下輸入編輯命令來編輯文本,然后在屏幕上查看輸出;而流編輯器是指sed每次只從文件(或輸入)讀入一行,然后對該行進(jìn)行指定的處理,并將結(jié)果輸出到屏幕,接著讀入下一行。

    ?

    為了簡化的闡述,下面將靜態(tài)模式用一個特例代替---main.c 。 通過第2行,針對main.c編譯器生成了如下的依賴關(guān)系:

    main.o:main.c defs.h

    ?

    而通過第三行將會被替換成main.o:main.d:main.c defs.h, 并且把這個依賴關(guān)系輸出到文件main.d中。

    ?

    OK,大致知道了它的意思,接下在,就細(xì)細(xì)的分析第三行命令的整個執(zhí)行過程,如下:

    1:將($@.$$$$)的臨時文件中的字符串信息(main.o:main.c defs.h)通過 “<” 輸送到sed命令中.

    2:sed中的s符號告訴sed命令,這次要做一個替換的任務(wù)。s符號的格式為:[address[,address]] s/pattern-to-find/replacement-pattern/[g p w n]。?? 下面來匹配上面的示例:

    ??? [address[,address]]:是指要處理的行的范圍,在這次的操作中采用的是默認(rèn)值。

    ??? pattern-to-find等價于\($*\)\.o[ :]*

    ??? replacement-pattern等價于\1.o $@ :

    3:Makefile使用%=main進(jìn)行替換后,命令變成了sed 's,\(main\)\.o[ :]*,\1.o main.d : ,g' < main.pid > main.d ;

    ????? 接下來就比較好分析了,主要是正則表達(dá)式的知識了。?? pattern-to-find使用到了4個正則表示式的知識點(diǎn)。

    ? ? ? ?第一: \(main\)為創(chuàng)建一個字符標(biāo)簽,即正則表達(dá)式中的“分組模式”,給后面的replacement-pattern使用。如\1.o 正則表達(dá)式“后向引用”,展開后就是main.o

    ? ? ? ?第二: \. 在正則表達(dá)式中‘.’作用是匹配一個字符。所以需要使用轉(zhuǎn)義元字符‘\’來轉(zhuǎn)義。

    ? ? ? ?第三: [ :] 匹配一組字符里的任意字符 。

    ? ? ? ?第四: *匹配0個或多個前一字符

    4 : 通過sed的正則表達(dá)式,輸入的main.o:main.c defs.h被替換成了main.o main.d : main.c defs.h。

    ?

    這里還有個有趣的東西,平時我們對命令s符號使用‘/’作為參數(shù)分割符,其實(shí)‘/’只是一種默認(rèn)的習(xí)慣罷了。你也可以使用','來作為分割符號,只要前后統(tǒng)一就OK。這里就是使用了','來作為分割符。

    ?

    以上是個人的理解, 在一個復(fù)習(xí)了一下正則表達(dá)式與sed。

    總結(jié)

    以上是生活随笔為你收集整理的Makefile 自动产生依赖的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。