Makefile入門(七):使用函數(shù)

使用函數(shù)

在Makefile中可以使用函數(shù)來(lái)處理變量宪肖,從而讓我們的命令或是規(guī)則更為的靈活和具有智能疯搅。make所支持的函數(shù)也不算很多濒生,不過(guò)已經(jīng)足夠我們的操作了。函數(shù)調(diào)用后秉撇,函數(shù)的返回值可以當(dāng)做變量來(lái)使用甜攀。

函數(shù)的調(diào)用語(yǔ)法

函數(shù)調(diào)用秋泄,很像變量的使用,也是以“$”來(lái)標(biāo)識(shí)的规阀,其語(yǔ)法如下:

$(<function> <arguments>)
或是
${<function> <arguments>}

這里恒序,<function>就是函數(shù)名,make支持的函數(shù)不多谁撼。<arguments>為函數(shù)的參數(shù)歧胁,參數(shù)間以逗號(hào)“,”分隔,而函數(shù)名和參數(shù)之間以“空格”分隔厉碟。函數(shù)調(diào)用以“”開(kāi)頭喊巍,以圓括號(hào)或花括號(hào)把函數(shù)名和參數(shù)括起。感覺(jué)很像一個(gè)變量箍鼓,是不是崭参?函數(shù)中的參數(shù)可以使用變量,為了風(fēng)格的統(tǒng)一款咖,函數(shù)和變量的括號(hào)最好一樣何暮,如使用“(subst a,b,(x))”這樣的形式,而不是“(subst a,b, ${x})”的形式铐殃。因?yàn)榻y(tǒng)一會(huì)更清楚海洼,也會(huì)減少一些不必要的麻煩。
還是來(lái)看一個(gè)示例:

comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))

在這個(gè)示例中富腊,(comma)的值是一個(gè)逗號(hào)坏逢。(space)使用了(empty)定義了一個(gè)空格,(foo)的值是“a b c”赘被,(bar)的定義用是整,調(diào)用了函數(shù)“subst”,這是一個(gè)替換函數(shù)帘腹,這個(gè)函數(shù)有三個(gè)參數(shù)贰盗,第一個(gè)參數(shù)是被替換字串,第二個(gè)參數(shù)是替換字串阳欲,第三個(gè)參數(shù)是替換操作作用的字串舵盈。這個(gè)函數(shù)也就是把(foo)中的空格替換成逗號(hào),所以$(bar)的值是“a,b,c”球化。

字符串處理函數(shù)

$(subst <from>,<to>,<text>)

  • 名稱:字符串替換函數(shù)——subst秽晚。
  • 功能:把字串<text>中的<from>字符串替換成<to>。
  • 返回:函數(shù)返回被替換過(guò)后的字符串筒愚。
  • 示例:
$(subst ee,EE,feet on the street)
把“feet on the street”中的“ee”替換成“EE”赴蝇,返回結(jié)果是“fEEt on the strEEt”。
$(patsubst <pattern>,<replacement>,<text>) 
  • 名稱:模式字符串替換函數(shù)——patsubst巢掺。
  • 功能:查找<text>中的單詞(單詞以“空格”句伶、“Tab”或“回車”“換行”分隔)是否符合模式< pattern>劲蜻,如果匹配的話,則以<replacement>替換考余。這里先嬉,<pattern>可以包括通配符 “%”,表示任意長(zhǎng)度的字串楚堤。如果<replacement>中也包含“%”疫蔓,那么,<replacement>中的這個(gè) “%”將是<pattern>中的那個(gè)“%”所代表的字串身冬。(可以用“\”來(lái)轉(zhuǎn)義衅胀,以“%”來(lái)表示真實(shí)含義的“%”字符)
  • 返回:函數(shù)返回被替換過(guò)后的字符串。
  • 示例:
$(patsubst %.c,%.o,x.c.c bar.c)

把字串“x.c.c bar.c”符合模式[%.c]的單詞替換成[%.o]酥筝,返回結(jié)果是“x.c.o bar.o”
備注:
這和我們前面“變量章節(jié)”說(shuō)過(guò)的相關(guān)知識(shí)有點(diǎn)相似滚躯。如:
(var:=;)” 相當(dāng)于 “(patsubst <pattern>,<replacement>,(var))”, 而“(var: <suffix>=<replacement>)” 則相當(dāng)于 “(patsubst %,%,(var))”嘿歌。
例如有:objects = foo.o bar.o baz.o哀九, 那么,“(objects:.o=.c)”和“(patsubst %.o,%.c,$(objects))”是一樣的搅幅。

$(strip <string>)

  • 名稱:去空格函數(shù)——strip。
  • 功能:去掉<string>;字串中開(kāi)頭和結(jié)尾的空字符呼胚。
  • 返回:返回被去掉空格的字符串值茄唐。
  • 示例:
$(strip a b c )

把字串“a b c ”去到開(kāi)頭和結(jié)尾的空格,結(jié)果是“a b c”蝇更。
$(findstring <find>,<in>)

  • 名稱:查找字符串函數(shù)——findstring沪编。
  • 功能:在字串<in>中查找<find>字串。
  • 返回:如果找到年扩,那么返回<find>蚁廓,否則返回空字符串。
  • 示例:
$(findstring a,a b c)
$(findstring a,b c)

第一個(gè)函數(shù)返回“a”字符串厨幻,第二個(gè)返回“”字符串(空字符串)
$(filter <pattern...>,<text>)

  • 名稱:過(guò)濾函數(shù)——filter相嵌。
  • 功能:以<pattern>模式過(guò)濾<text>字符串中的單詞,保留符合模式<pattern>的單詞况脆》贡觯可以有多個(gè)模式。
  • 返回:返回符合模式<pattern>;的字串格了。
  • 示例:
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
        cc $(filter %.c %.s,$(sources)) -o foo
$(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”看铆。
$(filter-out <pattern...>,<text>)
  • 名稱:反過(guò)濾函數(shù)——filter-out。
  • 功能:以<pattern>模式過(guò)濾<text>字符串中的單詞盛末,去除符合模式<pattern>的單詞弹惦》裼伲可以有多個(gè)模式。
  • 返回:返回不符合模式<pattern>的字串棠隐。
  • 示例:
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
 

$(filter-out $(mains),$(objects)) 返回值是“foo.o bar.o”石抡。
$(sort <list>)
  • 名稱:排序函數(shù)——sort。
  • 功能:給字符串<list>中的單詞排序(升序)宵荒。
  • 返回:返回排序后的字符串汁雷。
  • 示例:$(sort foo bar lose)返回“bar foo lose” 。
  • 備注:sort函數(shù)會(huì)去掉<list>中相同的單詞报咳。
    $(word <n>,<text>)
  • 名稱:取單詞函數(shù)——word侠讯。
  • 功能:取字符串<text>中第<n>個(gè)單詞。(從一開(kāi)始)
  • 返回:返回字符串<text>中第<n>個(gè)單詞暑刃。如果<n>比<text>中的單詞數(shù)要大厢漩,那么返回空字符串。
  • 示例:(word 2, foo bar baz)返回值是“bar”岩臣。(wordlist <ss>,<e>,<text>)
  • 名稱:取單詞串函數(shù)——wordlist溜嗜。
  • 功能:從字符串<text>中取從<ss>開(kāi)始到<e>的單詞串。<ss>和<e>是一個(gè)數(shù)字架谎。
  • 返回:返回字符串<text>中從<ss>到<e>的單詞字串炸宵。如果<ss>比<text>中的單詞數(shù)要大,那么返回空字符串谷扣。如果<e>大于<text>的單詞數(shù)土全,那么返回從<ss>開(kāi)始,到<text>結(jié)束的單詞串会涎。
  • 示例: (wordlist 2, 3, foo bar baz)返回值是“bar baz”裹匙。(words <text>)
  • 名稱:?jiǎn)卧~個(gè)數(shù)統(tǒng)計(jì)函數(shù)——words。
  • 功能:統(tǒng)計(jì)<text>中字符串中的單詞個(gè)數(shù)末秃。
  • 返回:返回<text>中的單詞數(shù)概页。
  • 示例:$(words foo bar baz)返回值是“3”。
  • 備注:如果我們要取<text>中最后的一個(gè)單詞练慕,我們可以這樣:(word(words <text>),<text>)惰匙。
    $(firstword <text>)
  • 名稱:首單詞函數(shù)——firstword。
  • 功能:取字符串<text>中的第一個(gè)單詞铃将。
  • 返回:返回字符串<text>的第一個(gè)單詞徽曲。
  • 示例:$(firstword foo bar)返回值是“foo”。
  • 備注:這個(gè)函數(shù)可以用word函數(shù)來(lái)實(shí)現(xiàn):(word 1,)麸塞。 以上秃臣,是所有的字符串操作函數(shù),如果搭配混合使用,可以完成比較復(fù)雜的功能奥此。這里弧哎,舉一個(gè)現(xiàn)實(shí)中應(yīng)用的例子。我們知道稚虎,make使用“VPATH”變量來(lái)指定“依賴文件”的搜索路徑撤嫩。于是,我們可以利用這個(gè)搜索路徑來(lái)指定編譯器對(duì)頭文件的搜索路徑參數(shù)CFLAGS蠢终,如: override CFLAGS +=(patsubst %,-I%,(subst :, ,(VPATH)))
    如果我們的“(VPATH)”值是“src:../headers”序攘,那么“(patsubst %,-I%,(subst :, ,(VPATH)))”將返回“-Isrc -I../headers”,這正是cc或gcc搜索頭文件路徑的參數(shù)

文件名操作函數(shù)

下面我們要介紹的函數(shù)主要是處理文件名的寻拂。每個(gè)函數(shù)的參數(shù)字符串都會(huì)被當(dāng)做一個(gè)或是一系列的文件名來(lái)對(duì)待程奠。
$(dir <names...>)

  • 名稱:取目錄函數(shù)——dir。
  • 功能:從文件名序列<names>中取出目錄部分祭钉。目錄部分是指最后一個(gè)反斜杠(“/”)之前的部分瞄沙。如果沒(méi)有反斜杠,那么返回“./”慌核。
  • 返回:返回文件名序列<names>的目錄部分距境。
  • 示例: (dir src/foo.c hacks)返回值是“src/ ./”。(notdir <names...>)
  • 名稱:取文件函數(shù)——notdir垮卓。
  • 功能:從文件名序列<names>中取出非目錄部分垫桂。非目錄部分是指最後一個(gè)反斜杠(“/”)之后的部分。
  • 返回:返回文件名序列<names>的非目錄部分粟按。
  • 示例: (notdir src/foo.c hacks)返回值是“foo.c hacks”伪货。(suffix <names...>)
  • 名稱:取後綴函數(shù)——suffix。
  • 功能:從文件名序列<names>中取出各個(gè)文件名的后綴钾怔。
  • 返回:返回文件名序列<names>的后綴序列,如果文件沒(méi)有后綴蒙挑,則返回空字串宗侦。
  • 示例:(suffix src/foo.c src-1.0/bar.c hacks)返回值是“.c .c”。(basename <names...>)
  • 名稱:取前綴函數(shù)——basename忆蚀。
  • 功能:從文件名序列<names>中取出各個(gè)文件名的前綴部分矾利。
  • 返回:返回文件名序列<names>的前綴序列,如果文件沒(méi)有前綴馋袜,則返回空字串男旗。
  • 示例:(basename src/foo.c src-1.0/bar.c hacks)返回值是“src/foo src-1.0/bar hacks”。(addsuffix <suffix>,<names...>)
  • 名稱:加后綴函數(shù)——addsuffix欣鳖。
  • 功能:把后綴<suffix>加到<names>中的每個(gè)單詞后面察皇。
  • 返回:返回加過(guò)后綴的文件名序列。
  • 示例:(addsuffix .c,foo bar)返回值是“foo.c bar.c”。(addprefix <prefix>,<names...>)
  • 名稱:加前綴函數(shù)——addprefix什荣。
  • 功能:把前綴<prefix>加到<names>中的每個(gè)單詞后面矾缓。
  • 返回:返回加過(guò)前綴的文件名序列。
  • 示例:(addprefix src/,foo bar)返回值是“src/foo src/bar”稻爬。(join <list1>,<list2>)
  • 名稱:連接函數(shù)——join嗜闻。
  • 功能:把<list2>中的單詞對(duì)應(yīng)地加到<list1>的單詞后面。如果<list1>的單詞個(gè)數(shù)要比<list2>的多桅锄,那么琉雳,<list1>中的多出來(lái)的單詞將保持原樣。如果<list2>的單詞個(gè)數(shù)要比<list1>多友瘤,那么翠肘,<list2>多出來(lái)的單詞將被復(fù)制到<list1>中。
  • 返回:返回連接過(guò)后的字符串商佑。
  • 示例:$(join aaa bbb , 111 222 333)返回值是“aaa111 bbb222 333”锯茄。

foreach 函數(shù)

foreach函數(shù)和別的函數(shù)非常的不一樣。因?yàn)檫@個(gè)函數(shù)是用來(lái)做循環(huán)用的茶没,Makefile中的foreach函數(shù)幾乎是仿照于Unix標(biāo)準(zhǔn) Shell(/bin/sh)中的for語(yǔ)句肌幽,或是C-Shell(/bin/csh)中的foreach語(yǔ)句而構(gòu)建的。它的語(yǔ)法是:
$(foreach ,<list>,<text>)
這個(gè)函數(shù)的意思是抓半,把參數(shù)<list>中的單詞逐一取出放到參數(shù)所指定的變量中喂急,然后再執(zhí)行< text>所包含的表達(dá)式。每一次<text>會(huì)返回一個(gè)字符串笛求,循環(huán)過(guò)程中廊移,<text>的所返回的每個(gè)字符串會(huì)以空格分隔,最后當(dāng)整個(gè)循環(huán)結(jié)束時(shí)探入,<text>所返回的每個(gè)字符串所組成的整個(gè)字符串(以空格分隔)將會(huì)是foreach函數(shù)的返回值狡孔。
所以,最好是一個(gè)變量名蜂嗽,<list>可以是一個(gè)表達(dá)式苗膝,而<text>中一般會(huì)使用這個(gè)參數(shù)來(lái)依次枚舉<list>中的單詞。舉個(gè)例子:
names := a b c d

files := (foreach n,(names),(n).o) 上面的例子中植旧,(name)中的單詞會(huì)被挨個(gè)取出辱揭,并存到變量“n”中,“(n).o”每次根據(jù)“(n)”計(jì)算出一個(gè)值病附,這些值以空格分隔问窃,最后作為foreach函數(shù)的返回,所以完沪,$(files)的值是“a.o b.o c.o d.o”域庇。
注意,foreach中的參數(shù)是一個(gè)臨時(shí)的局部變量,foreach函數(shù)執(zhí)行完后较剃,參數(shù)的變量將不在作用咕别,其作用域只在foreach函數(shù)當(dāng)中。

if 函數(shù)

if函數(shù)很像GNU的make所支持的條件語(yǔ)句——ifeq(參見(jiàn)前面所述的章節(jié))写穴,if函數(shù)的語(yǔ)法是:
(if ,) 或是(if <condition>,<then-part>,<else-part>)
可見(jiàn)惰拱,if函數(shù)可以包含“else”部分,或是不含啊送。即if函數(shù)的參數(shù)可以是兩個(gè)偿短,也可以是三個(gè)。<condition>參數(shù)是 if的表達(dá)式馋没,如果其返回的為非空字符串昔逗,那么這個(gè)表達(dá)式就相當(dāng)于返回真,于是篷朵,<then-part>會(huì)被計(jì)算勾怒,否則<else- part>會(huì)被計(jì)算。
而if函數(shù)的返回值是声旺,如果<condition>為真(非空字符串)笔链,那個(gè)<then-part>會(huì)是整個(gè)函數(shù)的返回值,如果<condition>為假(空字符串)腮猖,那么<else-part>會(huì)是整個(gè)函數(shù)的返回值鉴扫,此時(shí)如果< else-part>沒(méi)有被定義,那么澈缺,整個(gè)函數(shù)返回空字串坪创。
所以,<then-part>和<else-part>只會(huì)有一個(gè)被計(jì)算姐赡。

call函數(shù)

call函數(shù)是唯一一個(gè)可以用來(lái)創(chuàng)建新的參數(shù)化的函數(shù)莱预。你可以寫(xiě)一個(gè)非常復(fù)雜的表達(dá)式,這個(gè)表達(dá)式中项滑,你可以定義許多參數(shù)依沮,然后你可以用call函數(shù)來(lái)向這個(gè)表達(dá)式傳遞參數(shù)。其語(yǔ)法是:
(call ,,,,...) 當(dāng)make執(zhí)行這個(gè)函數(shù)時(shí)杖们,參數(shù)中的變量,如(1)肩狂,(2)摘完,(3)等,會(huì)被參數(shù)< parm1>傻谁,<parm2>孝治,<parm3>依次取代。而<expression>的返回值就是 call函數(shù)的返回值。例如:
reverse = (1)(2)

foo = (call reverse,a,b) 那么谈飒,foo的值就是“a b”岂座。當(dāng)然,參數(shù)的次序是可以自定義的杭措,不一定是順序的费什,如: reverse =(2) $(1)

foo = $(call reverse,a,b)
此時(shí)的foo的值就是“b a”。

origin函數(shù)

origin函數(shù)不像其它的函數(shù)手素,他并不操作變量的值鸳址,他只是告訴你你的這個(gè)變量是哪里來(lái)的?其語(yǔ)法是:
(origin ;) 注意泉懦,;是變量的名字,不應(yīng)該是引用崩哩。所以你最好不要在;中使用“”字符酣栈。Origin函數(shù)會(huì)以其返回值來(lái)告訴你這個(gè)變量的“出生情況”鲸阻,下面陈辱,是origin函數(shù)的返回值:
“undefined”
如果<variable>;從來(lái)沒(méi)有定義過(guò)沛贪,origin函數(shù)返回這個(gè)值“undefined”。
“default”
如果<variable>;是一個(gè)默認(rèn)的定義,比如“CC”這個(gè)變量塘偎,這種變量我們將在后面講述。
“environment”
如果<variable>;是一個(gè)環(huán)境變量闹伪,并且當(dāng)Makefile被執(zhí)行時(shí),“-e”參數(shù)沒(méi)有被打開(kāi)硼补。
“file”
如果<variable>;這個(gè)變量被定義在Makefile中票编。
“command line”
如果<variable>;這個(gè)變量是被命令行定義的鲤竹。
“override”
如果<variable>;是被override指示符重新定義的。
“automatic”
如果<variable>;是一個(gè)命令運(yùn)行中的自動(dòng)化變量吱肌。關(guān)于自動(dòng)化變量將在后面講述。

這些信息對(duì)于我們編寫(xiě)Makefile是非常有用的规揪,例如,假設(shè)我們有一個(gè)Makefile其包了一個(gè)定義文件Make.def,在 Make.def中定義了一個(gè)變量“bletch”月杉,而我們的環(huán)境中也有一個(gè)環(huán)境變量“bletch”,此時(shí),我們想判斷一下,如果變量來(lái)源于環(huán)境凹蜂,那么我們就把之重定義了汰瘫,如果來(lái)源于Make.def或是命令行等非環(huán)境的蝗拿,那么我們就不重新定義它同仆。于是,在我們的Makefile中俗批,我們可以這樣寫(xiě):

ifdef bletch

ifeq "$(origin bletch)" "environment"
 
bletch = barf, gag, etc.

endif

endif

當(dāng)然俗或,你也許會(huì)說(shuō),使用override關(guān)鍵字不就可以重新定義環(huán)境中的變量了嗎岁忘?為什么需要使用這樣的步驟辛慰?是的,我們用override是可以達(dá)到這樣的效果干像,可是override過(guò)于粗暴帅腌,它同時(shí)會(huì)把從命令行定義的變量也覆蓋了驰弄,而我們只想重新定義環(huán)境傳來(lái)的,而不想重新定義命令行傳來(lái)的速客。

shell函數(shù)

shell函數(shù)也不像其它的函數(shù)戚篙。顧名思義,它的參數(shù)應(yīng)該就是操作系統(tǒng)Shell的命令溺职。它和反引號(hào)“`”是相同的功能岔擂。這就是說(shuō),shell函數(shù)把執(zhí)行操作系統(tǒng)命令后的輸出作為函數(shù)返回浪耘。于是乱灵,我們可以用操作系統(tǒng)命令以及字符串處理命令awk,sed等等命令來(lái)生成一個(gè)變量七冲,如:
contents := (shell cat foo) files :=(shell echo *.c)
注意痛倚,這個(gè)函數(shù)會(huì)新生成一個(gè)Shell程序來(lái)執(zhí)行命令,所以你要注意其運(yùn)行性能澜躺,如果你的Makefile中有一些比較復(fù)雜的規(guī)則状原,并大量使用了這個(gè)函數(shù),那么對(duì)于你的系統(tǒng)性能是有害的苗踪。特別是Makefile的隱晦的規(guī)則可能會(huì)讓你的shell函數(shù)執(zhí)行的次數(shù)比你想像的多得多颠区。

控制make的函數(shù)

make提供了一些函數(shù)來(lái)控制make的運(yùn)行。通常通铲,你需要檢測(cè)一些運(yùn)行Makefile時(shí)的運(yùn)行時(shí)信息毕莱,并且根據(jù)這些信息來(lái)決定,你是讓make繼續(xù)執(zhí)行颅夺,還是停止朋截。
$(error <text ...>;)

產(chǎn)生一個(gè)致命的錯(cuò)誤,<text ...>;是錯(cuò)誤信息吧黄。注意部服,error函數(shù)不會(huì)在一被使用就會(huì)產(chǎn)生錯(cuò)誤信息,所以如果你把其定義在某個(gè)變量中拗慨,并在后續(xù)的腳本中使用這個(gè)變量沽瞭,那么也是可以的坛梁。例如:
示例一:

ifdef ERROR_001

$(error error is $(ERROR_001))

endif

示例二:

ERR = $(error found an error!)

.PHONY: err

err: ; $(ERR)

示例一會(huì)在變量ERROR_001定義了后執(zhí)行時(shí)產(chǎn)生error調(diào)用,而示例二則在目錄err被執(zhí)行時(shí)才發(fā)生error調(diào)用。

$(warning <text ...>;)

這個(gè)函數(shù)很像error函數(shù)蚊惯,只是它并不會(huì)讓make退出幻妓,只是輸出一段警告信息仔引,而make繼續(xù)執(zhí)行鄙皇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者其爵。
  • 序言:七十年代末冒冬,一起剝皮案震驚了整個(gè)濱河市伸蚯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌简烤,老刑警劉巖朝卒,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乐埠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)囚企,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門丈咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人龙宏,你說(shuō)我怎么就攤上這事棵逊。” “怎么了银酗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵辆影,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我黍特,道長(zhǎng)蛙讥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任灭衷,我火速辦了婚禮次慢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翔曲。我一直安慰自己迫像,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布瞳遍。 她就那樣靜靜地躺著闻妓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掠械。 梳的紋絲不亂的頭發(fā)上由缆,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音猾蒂,去河邊找鬼犁功。 笑死,一個(gè)胖子當(dāng)著我的面吹牛婚夫,可吹牛的內(nèi)容都是我干的浸卦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼案糙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼限嫌!你這毒婦竟也來(lái)了靴庆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怒医,失蹤者是張志新(化名)和其女友劉穎炉抒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稚叹,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰薄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扒袖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞茅。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖季率,靈堂內(nèi)的尸體忽然破棺而出野瘦,到底是詐尸還是另有隱情,我是刑警寧澤飒泻,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布鞭光,位于F島的核電站,受9級(jí)特大地震影響泞遗,放射性物質(zhì)發(fā)生泄漏惰许。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一史辙、第九天 我趴在偏房一處隱蔽的房頂上張望啡省。 院中可真熱鬧,春花似錦髓霞、人聲如沸卦睹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)结序。三九已至,卻和暖如春纵潦,著一層夾襖步出監(jiān)牢的瞬間徐鹤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工邀层, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留返敬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓寥院,卻偏偏與公主長(zhǎng)得像劲赠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.Makefile規(guī)范 target 這 一 個(gè) 或 多 個(gè) 的 目 標(biāo) 文 件 依 賴 于prerequisi...
    G風(fēng)閱讀 1,878評(píng)論 0 3
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,367評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理凛澎,服務(wù)發(fā)現(xiàn)霹肝,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 酒入口 臉微紅 你才下眉頭 我蕩漾心頭 言歡笑 燈微黃 攜手同舉杯 醉過(guò)知情濃
    清白臉龐閱讀 255評(píng)論 1 5
  • 唉塑煎,什么都被占用沫换,心好累,果然是氣場(chǎng)不合
    果然太弱閱讀 145評(píng)論 0 1