欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Makefile自動(dòng)化構(gòu)建實(shí)戰(zhàn):從核心語(yǔ)法到工程實(shí)踐

Makefile自動(dòng)化構(gòu)建實(shí)戰(zhàn):從核心語(yǔ)法到工程實(shí)踐 1. 從一段真實(shí)經(jīng)歷說(shuō)起為什么你需要make老手可能早就離不開make了但如果你是剛接觸Linux開發(fā)的新手或者一直用小項(xiàng)目、單文件代碼“裸編”過(guò)來(lái)的那我建議你認(rèn)真看完這篇文章。我當(dāng)年第一次接手一個(gè)稍微像樣一點(diǎn)的C項(xiàng)目幾十個(gè)源文件需要在終端里一條一條敲gcc命令頭文件改一個(gè)就要重新編譯一堆文件編譯選項(xiàng)還特別長(zhǎng)偶爾敲錯(cuò)一個(gè)參數(shù)就得從頭排查。那段時(shí)間每次“編一下跑一下”都像在玩掃雷整個(gè)人都很痛苦。后來(lái)某位同事讓我看了他項(xiàng)目里的Makefile我才反應(yīng)過(guò)來(lái)這東西就是在幫你把編譯、打包、清理這些重復(fù)勞動(dòng)全部自動(dòng)化。簡(jiǎn)單說(shuō)make是一個(gè)自動(dòng)化構(gòu)建工具而Makefile是給make讀的“構(gòu)建劇本”里面寫清楚目標(biāo)文件怎么生成、依賴哪些源文件、用什么命令生成。有了它你在終端里只需要敲一個(gè) make剩下的編譯、鏈接、輸出可執(zhí)行文件全部自動(dòng)完成。就算改了十幾個(gè)文件make也能精準(zhǔn)識(shí)別哪些需要重編哪些不用動(dòng)比全量重編快得多。這篇文章我不會(huì)跟你念man手冊(cè)。我只講兩件事一是Makefile的底層邏輯和核心語(yǔ)法到底怎么用二是我在實(shí)際項(xiàng)目里踩過(guò)的坑、驗(yàn)證過(guò)的寫法。按這套思路走不管你之后是做嵌入式、Linux服務(wù)端、還是搞開源項(xiàng)目都能很快寫出能用的Makefile并且知道每行在干什么。2. Makefile三要素目標(biāo)、依賴、命令之間的關(guān)系2.1 先把三要素掰開揉碎所有Makefile不管寫得多花哨本質(zhì)都是若干個(gè)“規(guī)則”。一條規(guī)則長(zhǎng)這樣target: prerequisites command三部分分別是目標(biāo)target你要生成的東西可以是一個(gè)可執(zhí)行文件、一個(gè).o文件也可以是一個(gè)動(dòng)作名比如clean。依賴prerequisites生成目標(biāo)之前必須具備的文件或其他目標(biāo)。多個(gè)依賴之間用空格分隔。命令command真正干活的shell命令通常就是編譯、鏈接、拷貝這些。命令前面必須是一個(gè)Tab縮進(jìn)不是四個(gè)空格不是兩個(gè)空格是Tab。這個(gè)坑我后面單獨(dú)說(shuō)因?yàn)閹缀跛行率侄荚谶@里翻車。舉一個(gè)最直觀的例子hello: hello.o gcc -o hello hello.o hello.o: hello.c gcc -c hello.c -o hello.o第一條規(guī)則說(shuō)要生成hello就得先有hello.o然后執(zhí)行g(shù)cc把hello.o鏈接成可執(zhí)行文件hello。第二條規(guī)則說(shuō)要生成hello.o得有hello.c然后執(zhí)行g(shù)cc把hello.c編譯成hello.o。你在終端敲make的時(shí)候make會(huì)先讀Makefile找到第一個(gè)目標(biāo)hello然后檢查它的依賴hello.o。如果hello.o不存在make就會(huì)去找hello.o對(duì)應(yīng)的規(guī)則先編譯出hello.o再回來(lái)鏈接出hello。整個(gè)過(guò)程是自動(dòng)遞歸的很像一個(gè)“依賴樹”。這是理解make工作的關(guān)鍵它不是一個(gè)簡(jiǎn)單的從左到右執(zhí)行腳本的工具而是以目標(biāo)為導(dǎo)向先算依賴關(guān)系再?zèng)Q定執(zhí)行哪些命令。2.2 make真正厲害的地方增量編譯不用make的時(shí)候手動(dòng)編譯最煩的就是每次都要把全部文件重新編一遍。大型項(xiàng)目幾十個(gè)文件還好幾百個(gè)文件的時(shí)候一次全量編譯可能要幾分鐘甚至十幾分鐘而你只是改了一行代碼。make天生就是為了解決這個(gè)問(wèn)題——它通過(guò)比較目標(biāo)文件和依賴文件的時(shí)間戳來(lái)決定是否重新生成目標(biāo)。舉個(gè)具體的流程你改了一個(gè)源文件那個(gè)文件對(duì)應(yīng)的.o目標(biāo)文件的時(shí)間戳就會(huì)比源文件舊make發(fā)現(xiàn)“哦這個(gè)目標(biāo)過(guò)期了”于是只重新編譯這個(gè)源文件。其他沒改動(dòng)的文件目標(biāo)比依賴新make直接跳過(guò)。最后再重新鏈接一次。這就是增量編譯幾百個(gè)文件的項(xiàng)目修改單個(gè)文件后的構(gòu)建可能只需要幾秒鐘實(shí)際效果很驚人。2.3 命令行里的空格與Tab問(wèn)題說(shuō)實(shí)話這是我在各種技術(shù)社區(qū)里看到最多、最經(jīng)典的報(bào)錯(cuò)現(xiàn)場(chǎng)Makefile:3: *** missing separator. Stop.這個(gè)錯(cuò)誤幾乎都是命令前面用了空格而不是Tab。為什么make只認(rèn)Tab這是歷史設(shè)計(jì)問(wèn)題但你必須接受它。很多編輯器會(huì)在配置里默認(rèn)把Tab轉(zhuǎn)換成空格這就會(huì)讓你的Makefile“看起來(lái)對(duì)齊了但實(shí)際沒法跑”。我目前的習(xí)慣是用Vim寫Makefile的時(shí)候在.vimrc里強(qiáng)行關(guān)閉expandtab并且設(shè)置自動(dòng)縮進(jìn)寬度為8用VS Code就把editor.insertSpaces設(shè)為false保證編輯的文件里插入的是真正的Tab字符。如果實(shí)在判斷不清可以在Vim里輸入set listTab字符會(huì)顯示為^I空格是普通的小點(diǎn)一眼就能分辨。2.4 偽目標(biāo)清理操作的隱藏陷阱你可能已經(jīng)注意到我前面提到的clean目標(biāo)并不是一個(gè)真實(shí)文件名。它只是一個(gè)動(dòng)作標(biāo)簽。如果你真的在目錄里放了一個(gè)叫clean的文件再執(zhí)行make clean的時(shí)候make會(huì)發(fā)現(xiàn)clean這個(gè)“目標(biāo)”已經(jīng)存在了而且沒有依賴時(shí)間戳永遠(yuǎn)比依賴新于是它直接告訴你“clean是最新的”不會(huì)執(zhí)行rm命令。解決這個(gè)問(wèn)題的標(biāo)準(zhǔn)寫法就是..PHONY: clean clean: rm -f *.o hello.PHONY的完整形式是.PHONY: clean嗎其實(shí)標(biāo)準(zhǔn)寫法是clean:本身就是規(guī)則目標(biāo)而.PHONY: clean這行是聲明格式就是clean:后面跟你的規(guī)則。這行聲明告訴makeclean不能當(dāng)作文件名來(lái)看待它的作用是“命令標(biāo)簽”每次都要執(zhí)行就算同名文件已經(jīng)存在也一樣執(zhí)行。不僅clean像all、install、test這種動(dòng)作型目標(biāo)都建議聲明為.PHONY防止和同名文件沖突。3. 變量和自動(dòng)化變量讓Makefile從“寫死”變“通用”3.1 用變量管好你自己的編譯參數(shù)剛開始寫Makefile的時(shí)候你可能會(huì)把編譯命令一行行寫死比如每個(gè).o規(guī)則都是gcc -Wall -g -c xxx.c -o xxx.o。三個(gè)文件還行十幾個(gè)文件的時(shí)候你光改一個(gè)編譯選項(xiàng)比如加一個(gè)-stdc99就得改十幾行而且很容易漏。變量的引入就是為了解決這種重復(fù)勞動(dòng)。Makefile里的變量定義和引用很有特點(diǎn)CC gcc CFLAGS -Wall -g -O2 -stdc99 LDFLAGS -lm hello: hello.o utils.o $(CC) $(LDFLAGS) -o hello hello.o utils.o hello.o: hello.c $(CC) $(CFLAGS) -c hello.c -o hello.o utils.o: utils.c $(CC) $(CFLAGS) -c utils.c -o utils.o變量用定義用$(變量名)引用。這樣修改編譯器或者編譯選項(xiàng)的時(shí)候只需要改開頭那幾行后面的規(guī)則全部自動(dòng)生效。把變量定義集中到Makefile頂部幾乎可以算是一種行業(yè)習(xí)慣你去看那些開源項(xiàng)目基本鋪滿了一堆變量定義。變量賦值還有幾種寫法我用過(guò)一次就比較有印象遞歸展開式賦值變量的值是“最后時(shí)刻”的展開結(jié)果。比如A $(B) B hello這時(shí)$(A)展開之后是hello因?yàn)橹钡秸嬲褂玫臅r(shí)候才去解析B的值。:直接展開式賦值立刻把右邊的值計(jì)算好存下來(lái)。如果你想避免循環(huán)引用和二次解析帶來(lái)的意外用:更穩(wěn)。?如果變量之前沒有賦值就給它賦這個(gè)值常用于讓用戶可以通過(guò)命令行覆蓋默認(rèn)參數(shù)。追加內(nèi)容適合分步添加編譯選項(xiàng)。我自己寫Makefile的時(shí)候一旦涉及多個(gè)相互引用的變量都會(huì)傾向用:因?yàn)檫@樣變量的解析是確定的不會(huì)因?yàn)橘x值順序不同而出現(xiàn)詭異的展開結(jié)果。你可以把理解成“活引用”:是“快照”大多數(shù)場(chǎng)景下快照更可控。3.2 自動(dòng)化變量自動(dòng)化變量的實(shí)操價(jià)值手動(dòng)在每條規(guī)則里把目標(biāo)名和依賴名都寫一遍依然是重復(fù)勞動(dòng)。make提供了一套自動(dòng)化變量專用來(lái)在規(guī)則命令中表示目標(biāo)、依賴等信息最常用的有三個(gè)$表示當(dāng)前規(guī)則的目標(biāo)文件名。$^表示當(dāng)前規(guī)則的所有依賴文件名會(huì)自動(dòng)去重。$表示當(dāng)前規(guī)則的第一個(gè)依賴文件名。拿前面的例子重寫立刻會(huì)清爽很多hello: hello.o utils.o $(CC) $(LDFLAGS) -o $ $^ hello.o: hello.c $(CC) $(CFLAGS) -c $ -o $ utils.o: utils.c $(CC) $(CFLAGS) -c $ -o $第一條規(guī)則里$會(huì)被替換成hello$^變成hello.o utils.o。第二條規(guī)則里$是hello.c$是hello.o。這樣不管以后新增多少源文件規(guī)則主體幾乎不用改。還有兩個(gè)不那么常用但偶爾能救命的$?比當(dāng)前目標(biāo)更新的依賴文件列表常用于部署場(chǎng)景比如只在某些源文件變化后重新執(zhí)行歸檔命令。$*模式匹配中匹配到的那部分文件名后面講模式規(guī)則時(shí)會(huì)用到。3.3 通配符和模式規(guī)則批量處理源文件沒有模式規(guī)則之前每個(gè).c文件都要對(duì)應(yīng)一條獨(dú)立的編譯規(guī)則項(xiàng)目里幾十個(gè)源文件就得復(fù)制幾十條看著就累。make支持模式規(guī)則用%做通配符可以把一類文件的構(gòu)建規(guī)則濃縮成一條。%.o: %.c $(CC) $(CFLAGS) -c $ -o $這行規(guī)則的含義是任何.o文件只要有一個(gè)同名的.c文件作為依賴就用后面這條命令編譯。加上之前講的目標(biāo)規(guī)則整個(gè)Makefile可以濃縮成CC gcc CFLAGS -Wall -g -O2 LDFLAGS -lm OBJS hello.o utils.o hello: $(OBJS) $(CC) $(LDFLAGS) -o $ $^ %.o: %.c $(CC) $(CFLAGS) -c $ -o $ clean: rm -f $(OBJS) hello .PHONY: clean這個(gè)Makefile已經(jīng)接近我平時(shí)使用的實(shí)際形態(tài)了。新增一個(gè)源文件的時(shí)候我只需要在OBJS變量里加一個(gè)對(duì)應(yīng)的.o文件名其他都不用動(dòng)。這才是自動(dòng)化構(gòu)建工具該有的效率。但是手動(dòng)維護(hù)OBJS這個(gè)列表還是有一點(diǎn)讓人不放心——如果忘了把新文件加進(jìn)去make不會(huì)自動(dòng)感知新出現(xiàn)的.c文件。更好的辦法是用函數(shù)自動(dòng)收集目錄下所有源文件。4. 函數(shù)和include讓Makefile自己學(xué)會(huì)找文件4.1 wildcard和patsubst兩個(gè)高頻函數(shù)make內(nèi)置了不少函數(shù)寫法看起來(lái)像變量引用但帶個(gè)符號(hào)。我平常用得最多的是這兩個(gè)SRCS $(wildcard *.c) OBJS $(patsubst %.c,%.o,$(SRCS))$(wildcard *.c)查找當(dāng)前目錄下所有.c文件返回一個(gè)以空格分隔的文件名列表。就算新拖進(jìn)來(lái)一個(gè)源文件SRCS也會(huì)自動(dòng)帶上它你完全不用手動(dòng)維護(hù)。$(patsubst %.c,%.o,$(SRCS))把SRCS里每個(gè).c后綴替換成.o后綴得到對(duì)應(yīng)的目標(biāo)文件列表。這樣整個(gè)Makefile就可以改成CC gcc CFLAGS -Wall -g -O2 LDFLAGS -lm SRCS $(wildcard *.c) OBJS $(patsubst %.c,%.o,$(SRCS)) TARGET app $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $ $^ %.o: %.c $(CC) $(CFLAGS) -c $ -o $ clean: rm -f $(OBJS) $(TARGET) .PHONY: clean這個(gè)版本已經(jīng)具備“項(xiàng)目級(jí)”感覺了。你把任意一個(gè)只有.c文件的目錄交給它它都能自動(dòng)識(shí)別并構(gòu)建出可執(zhí)行文件app。但別太高興這套寫法有一個(gè)大問(wèn)題它完全沒有處理頭文件依賴。如果你修改了一個(gè)頭文件只有include這個(gè)頭文件的.c文件才會(huì)檢測(cè)到變化嗎不會(huì)。make只比較.c和.o的時(shí)間戳根本不知道頭文件參與其中。這就引出了Makefile里最隱蔽、也最容易引發(fā)線上問(wèn)題的topic之一。4.2 頭文件依賴大部分新手栽跟頭的地方舉個(gè)例子main.c里include了utils.h你改了utils.h里的一個(gè)宏定義期望main.o重新編譯。但make會(huì)發(fā)現(xiàn)main.c沒有變main.o和main.c的時(shí)間戳相比沒過(guò)期于是它直接不重新編譯main.o最后鏈接出來(lái)的程序還是老版本。這種“改了沒反應(yīng)”的問(wèn)題非常隱蔽查起來(lái)也費(fèi)勁。解決思路是讓.o的依賴?yán)锇黫nclude的所有頭文件。你可以手動(dòng)寫main.o: main.c utils.h但每個(gè)文件include哪些頭文件多了之后手動(dòng)維護(hù)完全不堪重負(fù)還不如讓編譯器幫你統(tǒng)計(jì)。GCC提供了-MM選項(xiàng)可以輸出源文件對(duì)應(yīng)的頭文件依賴列表gcc -MM main.c輸出大概是main.o: main.c utils.h common.h這正好是make能用的依賴規(guī)則。利用GCC的-M家族選項(xiàng)可以讓Makefile自動(dòng)生成并包含這些依賴信息。目前我見過(guò)、也實(shí)際使用的是下面這套方案SRCS $(wildcard *.c) OBJS $(patsubst %.c,%.o,$(SRCS)) DEPS $(patsubst %.o,%.d,$(OBJS)) %.o: %.c $(CC) $(CFLAGS) -MMD -MP -c $ -o $ -include $(DEPS)-MMD在編譯的同時(shí)生成一個(gè).d文件里面記錄當(dāng)前.c文件包含的頭文件依賴。-MP為每個(gè)頭文件生成一個(gè)空的偽目標(biāo)防止頭文件被刪除后make報(bào)錯(cuò)找不到規(guī)則。-include和include不同即使.d文件不存在比如第一次清理后也不會(huì)報(bào)錯(cuò)make會(huì)繼續(xù)執(zhí)行。每次編譯時(shí).d文件都會(huì)被刷新頭文件依賴自動(dòng)更新。你再也不用手動(dòng)維護(hù)頭文件列表了。這套方案從我第一次用到現(xiàn)在一直很穩(wěn)幾乎成了我的標(biāo)準(zhǔn)配置。4.3 小心make的天然“遞歸陷阱”自動(dòng)化收集源文件還有個(gè)邊角問(wèn)題如果項(xiàng)目里有子目錄源文件分布在多個(gè)目錄wildcard *.c只能搜到當(dāng)前目錄搜不到子目錄。你可以在每個(gè)子目錄里放一個(gè)子Makefile然后在根目錄Makefile里遞歸調(diào)用子make這是很多中型項(xiàng)目采用的方式。但遞歸make不是萬(wàn)靈藥跨目錄的依賴追蹤會(huì)變復(fù)雜。另一種做法是收集所有子目錄的源文件統(tǒng)一在當(dāng)前Makefile里編譯SRCS $(wildcard *.c) $(wildcard src/*.c) OBJS $(patsubst %.c,%.o,$(SRCS))這種情況下編譯生成的.o仍然放在各自源文件所在的目錄里不會(huì)污染頂層目錄。如果項(xiàng)目繼續(xù)變大、目錄越來(lái)越多我建議你還是考慮構(gòu)建系統(tǒng)比如cmake。但就算用cmake理解make和Makefile的思維模式依然是必不可少的底層能力因?yàn)閏make最終生成的可能是Makefile而且很多詭異的構(gòu)建問(wèn)題最終都要追到make那一層去查。5. 實(shí)操手記一個(gè)多文件項(xiàng)目的構(gòu)建拆解5.1 從零搭一個(gè)“有點(diǎn)真實(shí)感”的小項(xiàng)目光講語(yǔ)法用處不大我拿一個(gè)小項(xiàng)目來(lái)完整走一遍。項(xiàng)目結(jié)構(gòu)是這樣project/ ├── Makefile ├── include/ │ └── utils.h └── src/ ├── main.c └── utils.c需求main.c里調(diào)用utils.c中的函數(shù)utils.h放在include目錄下編譯時(shí)要把include目錄加進(jìn)頭文件搜索路徑。頭文件在不同目錄編譯命令里就要加-I參數(shù)。Makefile可以這么寫CC gcc CFLAGS -Wall -g -O2 -Iinclude LDFLAGS -lm SRCS $(wildcard src/*.c) OBJS $(patsubst %.c,%.o,$(SRCS)) DEPS $(patsubst %.o,%.d,$(OBJS)) TARGET app $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $ $^ %.o: %.c $(CC) $(CFLAGS) -MMD -MP -c $ -o $ clean: rm -f $(OBJS) $(DEPS) $(TARGET) -include $(DEPS) .PHONY: clean注意自動(dòng)生成的.o和.d文件都在src目錄里沒有把主目錄弄亂。執(zhí)行make輸出大致是gcc -Wall -g -O2 -Iinclude -MMD -MP -c src/main.c -o src/main.o gcc -Wall -g -O2 -Iinclude -MMD -MP -c src/utils.c -o src/utils.o gcc -lm -o app src/main.o src/utils.o我親手驗(yàn)證過(guò)這個(gè)流程編譯、鏈接、生成可執(zhí)行文件一氣呵成。然后我故意改了include/utils.h里的一個(gè)結(jié)構(gòu)體定義再次執(zhí)行make它立刻重新編譯了main.o和utils.o這正是依賴自動(dòng)生成以后的效果。5.2 編譯流程中的關(guān)鍵一步鏈接順序有兩個(gè)源文件以上就會(huì)遇到鏈接順序問(wèn)題特別是用了靜態(tài)庫(kù)的時(shí)候。比如utils.o里用了數(shù)學(xué)庫(kù)函數(shù)鏈接命令要寫成-lm放在對(duì)象文件的后面。很多新手寫鏈接命令會(huì)把庫(kù)放在最前面結(jié)果鏈接器報(bào)undefined reference錯(cuò)誤。# 錯(cuò)誤示例 gcc -lm -o app main.o utils.o # 正確示例 gcc -o app main.o utils.o -lm鏈接器是按順序掃描輸入文件的它記住的是尚未解析的符號(hào)當(dāng)它掃到app的時(shí)候還沒有看到任何對(duì)象文件掃到utils.o里的未解析符號(hào)之后再遇到-lm才能找到對(duì)應(yīng)的實(shí)現(xiàn)。把-lm放前面等于提前把庫(kù)讀了后面遇到需要解析的符號(hào)已經(jīng)來(lái)不及了。這個(gè)經(jīng)驗(yàn)我在博客里反復(fù)提過(guò)因?yàn)檎娴暮苋菀妆缓雎浴?.3 一套清晰的目錄清理方案clean目標(biāo)要記得把自動(dòng)生成的.d也刪掉否則清理后重新構(gòu)建會(huì)誤用舊的依賴信息。我前面那份Makefile里已經(jīng)包含clean: rm -f $(OBJS) $(DEPS) $(TARGET)在規(guī)模大一點(diǎn)的項(xiàng)目里我還會(huì)加一個(gè)distclean目標(biāo)用來(lái)清掉比clean更徹底的構(gòu)建產(chǎn)物比如編譯緩存目錄和.config文件。這種命名習(xí)慣來(lái)自開源社區(qū)傳統(tǒng)看到distclean一般人都能猜到它的用途。如果你自己造一個(gè)remove_all這種名字也不是不行只是別人看你的Makefile會(huì)覺得有點(diǎn)微妙。6. 命令行使用技巧和常見問(wèn)題排查實(shí)錄6.1 常用命令行參數(shù)用得順手的幾個(gè)make的命令行參數(shù)本身就是一門小課我挑幾個(gè)平時(shí)最常用的說(shuō)一下make -n打印出會(huì)執(zhí)行的命令但不真正執(zhí)行。改完Makefile想檢查一下邏輯先跑一遍-n既安全又直觀。make -B強(qiáng)制重新生成所有目標(biāo)無(wú)視時(shí)間戳。有些時(shí)候你懷疑增量編譯狀態(tài)不對(duì)可以用它做一次干凈的驗(yàn)證。make -j4并行編譯4表示同時(shí)運(yùn)行4個(gè)編譯任務(wù)?,F(xiàn)在的機(jī)器動(dòng)不動(dòng)8核16核-j$(nproc)可以直接自動(dòng)填滿CPU大型項(xiàng)目編譯時(shí)間能縮短很多。make -C dir切換到指定目錄再執(zhí)行make。在頂層腳本里遞歸調(diào)用子項(xiàng)目時(shí)很有用。make V1這個(gè)參數(shù)不是make原生參數(shù)而是在Makefile里自己支持的。通過(guò)判斷V變量來(lái)決定打印詳細(xì)編譯命令還是簡(jiǎn)化的提示信息。很多開源項(xiàng)目都支持V1輸出完整命令調(diào)試編譯選項(xiàng)的時(shí)候非常有用。6.2 幾個(gè)高頻報(bào)錯(cuò)和排查思路做一個(gè)速查表都是我或者身邊同事實(shí)際碰到過(guò)的場(chǎng)景報(bào)錯(cuò)信息常見原因解決辦法missing separator命令前面用了空格而不是Tab把空格換成真正的Tab用編輯器關(guān)閉自動(dòng)轉(zhuǎn)空格No rule to make target xxx.o對(duì)應(yīng)的.c文件不存在或路徑不對(duì)檢查SRCS收集方式確認(rèn)文件有沒有在正確目錄下target xxx doesnt match the target pattern模式規(guī)則里的%匹配不到預(yù)期內(nèi)容檢查.o和.c是否同名檢查模式規(guī)則是否寫錯(cuò)undefined reference to function鏈接順序不對(duì)或沒有鏈接對(duì)應(yīng)的庫(kù)調(diào)整庫(kù)參數(shù)順序確認(rèn)庫(kù)路徑和庫(kù)名正確file changed as we read it編譯過(guò)程中源文件被改動(dòng)了多半是編輯器后臺(tái)自動(dòng)格式化保存時(shí)沖突重新make即可make: Nothing to be done目標(biāo)已是最新沒有需要重新生成的正常情況想強(qiáng)編用make -B6.3 調(diào)試技巧打印變量和拿Makefile當(dāng)Python寫遇到變量展開不符合預(yù)期的時(shí)候最快的辦法是在Makefile里加一行$(info SRCS $(SRCS)) $(info OBJS $(OBJS))執(zhí)行make的時(shí)候這兩行會(huì)直接把變量值打印出來(lái)方便你確認(rèn)文件收集是否正確。比你在腦子里推演快得多。如果只想在調(diào)試模式下輸出還可以配合ifeq判斷ifdef DEBUG $(info CFLAGS $(CFLAGS)) endif然后執(zhí)行make DEBUG1它就會(huì)額外打印編譯選項(xiàng)。6.4 處理文件名中的“特殊情況”如果說(shuō)還有哪個(gè)地方在實(shí)際開發(fā)中經(jīng)常弄出麻煩那就是文件名或路徑里的空格。Linux下文件系統(tǒng)是允許路徑帶空格的但Makefile對(duì)空格極其敏感。如果項(xiàng)目路徑里有空格patsubst和wildcard返回的列表會(huì)被空格拆開導(dǎo)致make把一個(gè)文件名當(dāng)成兩個(gè)文件處理。一個(gè)臨時(shí)方案是給變量里的路徑加上轉(zhuǎn)義但那個(gè)寫法又長(zhǎng)又丑。更好的方案是別讓項(xiàng)目路徑帶空格這是最省事的解法。Windows下帶入路徑到Linux環(huán)境時(shí)記得檢查一下目錄名。反正我現(xiàn)在的習(xí)慣是創(chuàng)建任何開發(fā)相關(guān)目錄都只用字母、數(shù)字、下劃線絕對(duì)不用空格和中文這是從多個(gè)構(gòu)建工具不只是make的承平年代里總結(jié)出來(lái)的血淚經(jīng)驗(yàn)。7. 從Makefile到更復(fù)雜的構(gòu)建系統(tǒng)7.1 讓Makefile支持多種構(gòu)建類型如果你發(fā)現(xiàn)項(xiàng)目開始區(qū)分debug版和release版可以這樣寫B(tài)UILD ? release ifeq ($(BUILD),debug) CFLAGS -Wall -g -O0 else CFLAGS -Wall -O2 endif執(zhí)行make BUILDdebug就是調(diào)試版不帶參數(shù)默認(rèn)是release版。這種設(shè)計(jì)模式移植到其他構(gòu)建系統(tǒng)也很常見。它讓Makefile變得像一個(gè)小型配置系統(tǒng)對(duì)中小項(xiàng)目來(lái)說(shuō)夠用且高效。7.2 自動(dòng)安裝目標(biāo)實(shí)際發(fā)版的時(shí)候我還會(huì)加一個(gè)install目標(biāo)把編譯好的可執(zhí)行文件拷貝到指定目錄PREFIX ? /usr/local install: $(TARGET) install -m 755 $(TARGET) $(PREFIX)/bin/?確保用戶可以通過(guò)make install PREFIX/opt/mytool覆蓋安裝路徑。同時(shí)install目標(biāo)依賴$(TARGET)所以它會(huì)先確保編譯完成再執(zhí)行安裝命令。這樣整個(gè)構(gòu)建、安裝流程就串起來(lái)了。7.3 什么時(shí)候該從make遷移到cmakeMakefile不是萬(wàn)能的。當(dāng)項(xiàng)目開始出現(xiàn)以下信號(hào)我會(huì)認(rèn)真考慮遷移到cmake需要生成并安裝動(dòng)態(tài)庫(kù)、靜態(tài)庫(kù)、可執(zhí)行文件多種產(chǎn)物需要跨平臺(tái)Windows、Linux、macOS構(gòu)建需要處理復(fù)雜的條件編譯、第三方依賴查找項(xiàng)目多人協(xié)作希望構(gòu)建系統(tǒng)自動(dòng)探測(cè)環(huán)境。cmake通過(guò)CMakeLists.txt描述構(gòu)建邏輯能生成對(duì)應(yīng)平臺(tái)的構(gòu)建腳本比如Linux下可以生成MakefileWindows下可以生成Visual Studio工程。但學(xué)cmake前我依然建議先吃透Makefile因?yàn)閙ake的規(guī)則、依賴、變量和編譯參數(shù)這些底層概念在cmake里全都換了個(gè)形式出現(xiàn)底子不牢的話cmake里的target、interface這些抽象會(huì)讓你更迷失。8. 一些實(shí)實(shí)在在的經(jīng)驗(yàn)和碎碎念寫到這里主體內(nèi)容基本講完了。最后分享幾個(gè)我個(gè)人在實(shí)際操作中的體會(huì)希望對(duì)你有幫助。第一Makefile不是背出來(lái)的是“用”出來(lái)的。你拿一個(gè)小項(xiàng)目反復(fù)改、反復(fù)跑很快就能把語(yǔ)法記牢。我一直覺得構(gòu)建工具的掌握程度應(yīng)該以“出了問(wèn)題能不能自己查”為標(biāo)準(zhǔn)而不是能默寫多少函數(shù)名。第二調(diào)試Makefile問(wèn)題的時(shí)候先分清是“語(yǔ)法錯(cuò)誤”還是“邏輯錯(cuò)誤”。語(yǔ)法錯(cuò)誤通常一眼能瞄出來(lái)比如缺Tab、少冒號(hào)邏輯錯(cuò)誤才真正燒腦比如改動(dòng)沒觸發(fā)重編、依賴漏了頭文件。這種時(shí)候用make -d可以輸出極詳細(xì)的調(diào)試信息配合$(info ...)打印變量多試幾次總能找到癥結(jié)。第三保持Makefile簡(jiǎn)單干凈。很多人為了炫技會(huì)把Makefile寫得像腳本語(yǔ)言用一堆嵌套函數(shù)和條件判斷。其實(shí)Makefile的可維護(hù)性跟代碼一樣重要。我見過(guò)一個(gè)幾千行的“新一代”Makefile最后沒人能改得動(dòng)。克制是第一原則。第四建議你用版本管理工具管理Makefile。它就像你的源代碼一樣被多個(gè)人修改和review出了問(wèn)題可以快速回退。最后再說(shuō)一個(gè)小技巧。如果你和我一樣經(jīng)常要在一個(gè)目錄里反復(fù)調(diào)試編譯可以把debug和release兩種配置都寫在同一個(gè)Makefile里然后用一個(gè)變量去切換。我第一次用這個(gè)模式的時(shí)候還不以為意但項(xiàng)目一旦大起來(lái)這種小小的“配置化”思路會(huì)幫你省掉非常多改參數(shù)的時(shí)間。構(gòu)建工具的本質(zhì)就是讓機(jī)器去做重復(fù)勞動(dòng)人只負(fù)責(zé)定義規(guī)則。make讓這件事變得足夠輕、足夠直接所以三十多年過(guò)去了它依然是Linux開發(fā)繞不開的基本功。希望能幫你在構(gòu)建這條路上少踩幾個(gè)坑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99碰碰中文| 日本97在线观看| 专区无日本视频高清8| 丁香久久| 亚洲AV成人一区二区在线观看| 五月天婷婷成人网| 色婷婷yy久| 久久久久99精品成人网站| 久天综合| 夜夜夜夜做天天天做无码视频| 99热这里只有精品50| 欧美成人色婷婷| 欧美日韩成人高清在线| 97五月天| 97色视频网| 丁香五月天堂网| 成人精品视频99在线观看免费| 九九亚洲天堂| 好看的国产精品| 99热免费网站| 日本社区五月天激情| 狠狠干,狠狠操| 另类视频综合| 婷婷六月偷拍| 五月丁香婷婷爱激情综合网| 99这里只有精彩视频| 国产美女视频久| 亚洲精品午夜国产va久久成人| AV中文在线| 97日本在线播放| 日本三久久| 五月丁香久久网| 色99热| 婷婷五月丁香综合| 91丨九色丨首页| 97在线/亚洲| 人妻系列久久久久久久久久久| 人人视频色| 激情综合网激情五月天| 综合色色五月| 狠狠做六月爱婷婷综合aⅴ| 天天撸天天干天天插| 色综合天天| 色综合综合色| 婷婷久草| 婷婷综合偷拍| 日在线V视频在线播放| 天天干天天操天天拍| 色墦五月丁香| 婷婷终合色图| 婷婷五月天电影在线| 热九九在线| 亚洲精品视频在线| 色五月天电影| 26uuu精品一区二区| 丁香五月激情综合婷综| 久久婷婷伊人| 九九视频在线观看| 欧美综合激情五月| 天天爽在线视频| 另类在线免费视频| 色播激情| 欧美啪啪网| se婷97| 四季8848精品成人免费网站| 国内精品免费一区二区2009| 伊人婷婷五月天av| 亚洲妇女熟BBW| 激情五月天开心| 激情婷婷人妻| 激情五月综合色| 久久婷婷电影| 97操操网| 婷婷综合网| 野战毛片三一3| 婷婷97碰碰| 99婷婷精品推荐在线视频| 狠狠的日| 九九草热在线观看| 亚洲艹网| 热九九精品| 五月婷性爱| 九九aV| 热久久这里只有精品| 五月婷婷丁香大陆免费| 婷婷五月天成人五月天| 激情伊人| 成人五月天丁香婷| 伊人玖玖网| 九九大香视频| 99热精品在线免费观看| 久久机只有这里精品| 操操碰| 丁香婷婷五月天成人| 久久久久9| 欧美 日韩 成人| 亚洲精品性色| 九九操综合网| 99热九九这里只有精品| 久热九九| 九色PORNY自拍成人精彩视频| 九九99九九精品视频| 国精产品一区一区三区免费视频| 激情五月天视频| 超碰99资源站| 激情久久丁香| 99这里都是精品| 欧美性丁香色色五月天综合爱爱| 狠狠操之狠狠操| AA久久| 色五月色情| 五月天色小说| 国产婷婷婷| 99在线观看| 成人视屏在线观看| 秋霞A V毛片| 99热的无码| 亚洲色婷婷五月天| 99九九热视频| 久9免费视频| 肏日网在线看| 久久婷婷五| 丁香五月婷婷国产av| 最近中文字幕2019视频1| 亚洲第一综合| 26uuu国产| 久热免费| 高清一区二区三区日本久| 日本色色色| 粉嫩av懂色av蜜臀av熟妇| 夜丁香五月婷婷| 亚洲色色图片| 五月婷婷六月丁香激情综合网| 国庆精品久久| 777丁香六月青青草婷婷综合久月| 色色网站免费在线视频| 五月婷婷狠天天色综合| 蜜乳A√| 五月丁香网中文字幕| 97丁香五月天| 99黄色| 丁香五月综合在线播放| 亚州性爱99| 操你av| 久久AV电影| 六月色国内综合| 日韩综合久久| www.久久爱| Av九九| 五月丁香色色网| 91精品丝袜久久久久久| 伍月婷婷免费视频| 五五月五月| 五月综合婷婷网| 日本特黄aaaaa| 色噜噜伊人| 亚洲 欧洲 国产 伦综合| 91精品综合久久久久久五月丁香| 五月天婷婷久久| 综合精品99| 五月丁香AV在线| 免费无码毛片一区二区A片| 超碰国产在线| 精品一区二区三区四区五区六区| 婷婷色系婷色| 操B无码视频国语| se色99| 饮料下药迷倒漂亮女同事强干| 26uuu精品一区二区| 狠狠色五月天| 97精品在线| 九九热在线精品视频| 亚洲精品无码A片一区二区| 伊人五月人妻精品| 69人人操人人爽| 五月花丁香婷婷| 5月丁香综合图区| www.狠狠干com| 色色五月天激情| 色情久久久| 另类综合激情| 久久综合伊人综合在线| 亚洲av电影在线| 99在线小视频| 超碰碰碰碰| 这里只有精品在线观看视频| 天天插轮理| 亚洲日本韩国| 五月天婷婷在线AN| 大香蕉五月天婷婷| 极品人妻VIDEOSSS人妻| 五月天色丁香| 神马欧美精| 最新热中文字幕| 婷婷色五月综合丁香| 国产成人va在线| 思思热精品在线| 丁香婷婷性爱| 婷婷五月丁香图片人人操| 五月综合激情图片| 婷婷她六月天| 五月婷婷开心综合| 婷婷中文字幕| www久久久久久| 色婷婷亚洲婷婷| 婷婷区日本| 亚洲婷婷免费| 五月丁香影院| 久久久久98| 丁香六月婷婷综合| 天天噜天天爱| 天堂综合久| 日本三级大片| 91 原创 在线 九色| 人人色人人摸人人看| 九九热视频免费| 成人在线不卡| 99热国产精品| 四川BBB搡BBB搡多人乱亂| 综合久久六月| 婷婷五日b| 色婷婷狠狠| 91日韩在线| 五月丁香婷婷钟和色图| 日韩色色网| 婷婷精品性性性性性性性| 狠狠色综合网| 操逼五月婷婷| 色色激情五月天| 色五月丁香伊人| 五月婷婷六月丁香综合在线| 国产成人亚洲综合亚洲| 五月天激情偷拍| 第四色婷婷五月| 五月综合激情| 97男人天堂| 婷婷欧美偷拍综合| 99九九综合久久九九| av高清无码| 色婷婷免费视频| 日韩三级片一区二区| 丁香六月婷婷综合缴| 97色色色| 五月婷婷AV| 婷婷五月天电影区小说区| 免费视频无码| 91AV婷婷| 国产26uuu| 久久久久久性爱视频| 99在线小视频| 激情亚洲婷婷| 激情五月天综合| 久久久人妻| 丁香九月激情久久| 五月婷六月天| 亚洲精品又粗又大又爽A片| 亚洲碰碰碰| 婷婷五月中文字幕国产| 九九色色| 五月天激情播播网| 婷婷在线精品| 热99久| 丁香五月婷婷亚洲另类| 99啪啪| 婷婷的99视频网站| 五月丁香六月天| 九九九九精品精| 丁香六月婷婷开心| 五月婷综合| 99精品偷自拍| 日本va欧美va精品发布视频 | 96人人操人人操人人| 成人电影在线免费试看| 久久婷婷丁香视频网| 五月丁香激情婷婷综合| 日本黄色三级片内射| 26UUU| 玖玖爱资源站| 久婷久婷| 思思久久精品| 亚洲色五月| 久久丁香九| 九九热这里只有精品9| 99精品热| www九九| 六月婷婷五月丁香| 美腿丝袜AV天堂网| 婷婷射丁香| 91麻豆国产三级精品福利在线观看| 色欲Av五月天| 色婷婷在线视频| 日韩成人精品中文字幕| www久久久| 中文字幕九九九九| 99操逼视频| 黑人无码一区| 99爱视频| 91丨九色丨熟女| 国产精品人人妻人人爽| 色婷婷色| 夜夜爱伊人| 五月狠狠| 久久久久久97| 婷婷五月丁香六月| 激情小说五月天| 色婷成人狠干| 99riAV国产精品视频| 另类视屏| 五月久久婷婷丁香| AV九九| 91操操| 色婷久九| 91久久久久久久久18| 九色视频91疯狂| 亚洲黄色精品| www.色多多婷| 国产精品成人av在线观看春天| 天天综合天综合久久网| 天天爽天天日天天舔| 97婷婷五月丁香| 五月婷婷激情四月| 奇米四色五月天| 影音先锋777xfplay色资源网站| 麻豆忘忧草午夜| 色色色.COM| 无码一区二区三区四区五区91c| 五月丁香婷婷潮喷中文字幕| 美女视频图片久久91| 亚洲va欧洲va国产va不卡| 奇米色大香蕉| 色色日本欧美| AA丁香综合激情| 欧洲色| 99这里只有免费的小视频在线观看| www色色com| 3pAV| 99只有精品9| oVV4WIB3vFi8D| 高潮毛片又色又爽免费| 激情五月色在线播放| 色色色色色五月| 性生活视频98791| 天天色播| 国产伦亲子伦亲子视频观看| 国产精品色婷婷AV综合色色| 伊人婷婷大香蕉| 色婷婷五月天偷拍| 婷婷日日天天| 九九久久偷拍| 伊人激情啪啪| 4399欧美另类视频| 久久久中文| www色婷婷久久综合久色 | 99操视频| 人人艹艹艹| 激情婷婷五月天在线观看| 激情五月狠狠喔| 婷婷五月综合色拍| 色五月激情问网站| 91麻豆国产三级精品福利在线观看| 99热精品在线播放| 久草天堂| 色色五月婷婷狠狠| 五月丁香六月激情综合| 99热这里只有精品10| 激情性爱五月天网页| 丁香婷婷视频在线| 操操操操操操婷婷五月天| 国产精品激情AV久久久青桔| 综合网五月| www.丁香五月| 丁香啪啪中文字幕| 久久久中文| 99热精国产这里只有精品| 大香蕉欧美在线| 婷婷狠狠操| 天天操天天谢| 九九九九综合| 亚洲无码影音| 91精品久久久久久77777| 六月亚洲| 99伊人婷婷在线| 色爱亚洲| 人妻久久久久久久久久久| 久久99婷婷| 色135综合网| 播五月丁香三月婷婷| 俺也去婷婷五月天第五色| 综合色图婷婷| 亚洲激情av| 影音先锋xfplay资源男人网| 日韩操女| www.色五月| 五月婷婷影院| 久热最新视频| 91热99| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 激情图片亚洲| 91日韩在线| 一区二区三区四区无码| 欧美久久婷婷| 伊人超碰在线| 人人操AV| 天天碰夜夜爽| 5月色亭亭视频| 99人人操人人操人人精| 激情内射人妻1区2区3区| 免费播放片大片| 婷婷综合成人五月天| 991国产精选视频在线播放下载| 三人荫蒂添的好舒服A片| 激情人妻综合| 天天操天天日天天爽| 五月丁香亭亭操逼| 99丝袜精品视频网站| 激情小说五月天| 九九在线视频| 日在线V视频在线播放| 996er热| 色天使久久综合| 26UUU欧美| 热99这就是精品视频| 欧美色骚婷婷五月天| 国产成人在线不卡AV| 69凹凸成人综合网| 婷婷综合激情| 婷婷永久在线| 亚洲视频图片婷婷五月| 极品 少妇 内射| 另类视频综合| 激情综合色婷婷啪啪六月天| 开心婷婷五月综合| 久久99国产综合精品免费| 激情床戏| 天天爱天天狠天天透| 丁香六月天婷婷开心综合| 色五月婷婷中文字幕在线观看| 成年视频免费观看| 玖玖@三月天天丁香婷婷| 婷婷五月天AV| 日韩欧美骚货| 婷婷五月天色综合翘| 日本啪啪天堂| 香焦网五月天| 婷婷五月丁香色播| 丁香婷婷五月天成人| 丰满少妇猛烈A片免费看观看| 色婷婷六月| 日日操天天| 色婷婷五月天激情综合| 色婷丁香五月| 激情网五夜婷婷| 99资源在线视频| 日本欧美999久久久三级片| .青娱乐天天操B| 丁香五月婷婷五月| 婷婷丁香六月| 一级性爱视频| 9久久精品| 欧美色九| 在线观看亚洲视频影院| 影音先锋91资源站| 丁香五月成人| 婷婷五月天成人网| 开心激情婷婷| 色色性爱视频| 久久99美女精彩视频| 五月天四色房丁香| 久久五月丁香综合17C| site:jszngf.com| 天天操天天爱天天日| 亚洲无aV在线中文字幕| WWW·色色色·COM| 中文字幕成人影视| 亚洲成人无码网站| av在线激情| 亚洲综合欧美色丁香婷婷888月图片| 综合色在线| 99色爱| 亚洲精品久久久久久久久久吃药| 六月婷婷五月天| 淫视馆aV二区一区| 97热这里只有精品| 狠狠狠狠狠狠| 欧美性猛交 XXXX 乱大交| 大香蕉九九| 色色操| 精品亚洲国产成人A片在线鸭王| 天天日天天色| 国外亚洲成AV人片在线观看| 黄色国久久| 日韩人妻无码精品| 久久精品4| 日本色图综合| 九九热超碰| 丁香成人五月天| 无码色| 五月天伊人网| 九九综合| 久久艹 五月天| 99九九这里有免费视频| www.九月婷婷丁香.com| 懂色av蜜臀av粉嫩av永陈冠希| 五月丁香成年黄色| 久久9久| 男人的天堂999| 91精品电影18T| 激情五月天在线| RenRenSe在线视频网站| 色噜噜狠狠狠综合曰曰曰| 五月开心深爱激情网| 99热这里只有精品1| 国产26uuu| 99精品无码| 五月丁香啪啪啪综合网| 色婷婷狠狠18禁| 麻豆AV一区二区三区| 色狠狠婷婷| 亚州第一A片| 国产激情在线| 看黄的网站18禁| 啪啪干伊人婷婷| 久久这里只有精品视频1| 99av视频| 五月激情网站| 亚洲爆乳无码精品AAA片蜜桃| 久久无码成人| 五月久久丁香| 丁香婷婷色色| 色播五月婷婷综合| 日韩十国产极品久久| 激情丁香五月婷婷| 99久久这里只有精品| www.五月天| 综合AV网| 操日视频| 狠狠色激情在线| av在线色五月丁香婷区久| 久久免片| 99综合视频| 91人人人人人| 久久精品天| 美国不卡视频| 五月天另类小说亚洲| 69激情小说| 久久激情五月婷婷| 97久久人人| 日本不卡高字幕在线2019| 国产精女同一区二区三区久| 九色91国产| AV五月丁香| 激情五月色播五月| 99视频在线精品| 天天插操| 夜色综合网| 色五月婷婷五月丁香五月激情五月视频| 在线成人av播放| 婷婷丁香视频| caobi四区| 怡红院视频| 思思久久精品| 丁香五月大香蕉在线99| 黄网在线播放| 久久婷婷五月综合色丁香| 五月天综合久久| 91夫妻视频| 91精品婷婷国产综合| 六月激情婷婷综合| 黄色一级影片| 超碰人妻公开在线| 色婷婷综合久久久久| 丁香五月日啪| 91ncm视频| WWW.久久.COM| 亚洲综合九九| 五月天婷婷爱| 亚洲无AV在线中文字幕| 色婷婷综合综合网| 色婷婷五月天综合网| 亚洲五月婷| 丁香五月婷婷总啪啪| 亚洲小视频免费播放| 人人爱人人添| 思思热视频| 九九九九中文字幕| 色婷婷六月激情| 天天天干夜夜夜操| 亚洲精品又粗又大又爽A片| 色婷婷久久天天性爱| 色色色色色色97| 丁香成人五月天| 任你干线上免费视频有3吗| 欧美成性色| 九九热精品6| 婷婷激情五月综合| 丁香五月天激情四射网| 婷婷爱婷婷| 99综合视频| 日韩综合久| 五月激情丁香| www激情| 六月丁香中文字幕| 婷婷五月天男人影院色色网| 三级三久久线久久99久目本WW| 一本九九色| 人人干人人操人人摸人人做| 久热这里只有精品6| 偷拍九九五月丁香婷婷| 五月激情丁香| 天天插天天爽| 色色无码| 久久天天天| 97色天堂| 色色综合热| 小视频aaa久久久| 婷婷无码视频| 97碰碰在线观看视频| 97五月天婷婷| 日本精品人妻无码77777| 亚洲乱码在线观看| 99精品免费视频| 久久R激情| 九九爱这里只有精品| 黄网在线播放| 人人干99| 狠狠狠狠狠狠| 色色综合五月| 九九精品视频在线6| 啪啪一区| 99久久丝| 色五月婷婷五月| 九九爱精品网站| 密乳视频| 亚洲欧美在线观看| AV天堂淫乩| 99热8| 五月色婷婷中文字幕| 五月丁香六月天| 久久精品日| 成人精品99| 丰满少妇猛烈A片免费看观看| 婷婷五月天AV| 91碰碰| 日本久热| 九九综合伊人| 色玖玖爱| 91精品久久久久久77777| 欧美日韩成人在线网| 操骚货在线| 9热在线视频| 99视频这里只有精品10| 激情五月婷婷色色| 欧美黄色AA片哗啦啦啦| 97性高潮久久久| 丁香成人视频| 五月丁香婷色| 日本丁香五月| 99亚洲精美视频在线观看| 丁香五月偷拍| 狠狠色丁香婷婷久久综合| 丁香五月欧美| 成人做爰高潮A片免费视频| 99这里只有精品国产| 99亚洲天堂| 777久久综合视频| 婷婷五月天福利| 5月色亭亭视频| 熟女人妻一区二区三区免费看| 五月丁香久久久日婷婷久久婷婷日| 伊人综合网站| 久久草婷婷丁香网站| 超碰婷婷色| 丁香五月天操B| 久久xxxx| 成人片在线免费看| 五月天婷婷免费视频| 激情综合网色五月| PORNY九色9l自拍视频成人| 色婷婷综合久久久久| 亚洲综合色色| 婷婷六月综合在线| 丁香激情综合| 精品人妻一区二区三区四区不卡在| 亚洲av午夜精品一区二区| 久久A V无码视频| 激情五月天第四色| 另类激情五月| 九九热这里只有精品首页| 五月婷在线| 亚洲丁香婷婷五月天综合色| 人与禽A片啪啪| 亚洲综合丁香五月天| 秋霞丝袜啪啪啪| 热久久91| 天天免费成年人视频| 国产成人精品亚洲线观看| 五月天三级| 国产九月婷婷| 婷婷九月综合| 色噜噜狠狠色综合无码久久欧美| 四川BBB搡BBB搡多人乱亂| 99热99这里只有精品| 99视频在线啪| 国产精品电影| 97干婷婷五月天| 国产性av| 婷婷五月天成人| 国产激情综合| 青青久在线视频免费观看| 婷婷草| 色色色婷婷五月| 五月婷婷激情综合| 思思re视频在线| 大香蕉人人网| 九九热视频这里只有精品| 大香蕉五月丁香| 99精品偷自拍| 色久丁香五| 丁香五月婷婷激情小说| 婷婷丁香色五月天| 日本五月天网站| 色一区高清| 操日本99| 色五月色五天色情网| 停停色综合伊人| www色哟哟| 女人天堂av| 9色小视频在线观看| 超碰在线观看99| 五月丁香AV、伊人业余、性色熟妇| 丁香六月av| 五月天色婷婷综合| 婷婷五月花西瓜| 激情综合五月丁香| 9九九久久精品无码专区| 99re这里只有| 成人婷婷色五月天| 亚洲操B视频| 亚洲人妻av| 五月婷亚洲精品| 这里只有精品日韩| 97人人干。| 五月成人网站| 婷婷五月天成人小说| 99久.| 伊人大综合| 精品激情| 噜噜久| 看黄的网站18禁| 伊人热婷婷| 97五月天| 婷婷玖玖五月天| 久久综合网免费视频| 五月婷婷亚洲色图| WWW.桔色成人.COM| 欧美性爱中文字幕| 五月激情基地| 丁香五月手机在线| 日日夜夜九九| 亚洲色婷婷五月天| 婷婷成人视频| 激情五月天在线观看色婷婷| 99玖玖人人| 99婷婷狠狠成为人免费视频| 国产99久久久| 亚洲色99| 99精品视频免费在线播放| 中文字幕性爱视频| 97在线99| www.minyis.com【JT】实力收量可预付QQ2101460746 | 日本久久99| 九九精品婷| 国产欧美精品AAAAAA片| 亚洲成人网在线观看| 牛牛碰免费| 五月丁香久久综合| 婷婷爱爱蜜臀天天操| 校园春色亚洲色| 久99视频| 亚洲在线操| 99热这里只有精品 搜| 亚洲色涩视频| 97caop| 五月婷婷色| 婷婷激情图片| 丁香婷婷久久老熟女综合网| 久久这里都是精品免费| 色情五月天。| 七月丁香婷婷 色色| 五月婷婷六月丁香| 亚洲综合1024| 思思热这里只有精品| 婷婷深爱网| 丁香五月婷婷久久久| 99热最新精品| 久久人五月| 国产av网| 五月丁香综合网| 夜夜撸天天操| 日韩啪| 色色com| 色五月综合激情| 九九视频热| 成人久久天天x资源站| 欧美内射AA| 丁香五月天天| 99热每日| 专区无日本视频高清8| 99爱视频在线观看这里只有精品| 情色婷婷五月天| 少妇综合网| 色色色免费视频| 久久九九蜜| 亚洲十月婷婷综合| 五月婷婷久久综合| 天天搞夜夜六| 婷婷六月丁香开心深深爱| 超碰亚洲天堂| 九九99九九99九九99视频网| 六月婷婷最新网址| 996黄色片| 日韩少妇内射免费播放| 国产精品第一国产精品| 九九亚洲视频| 九九RE视频在线精品| 人妻无码精品一区| 激情小说五月天| 超碰九九热| 激情久久丁香| 99色五月| www.婷婷,com| 婷婷的色色五月天| 大香蕉久久婷婷精品综合| 五月婷婷五月天| 久久激情网| 丁香五月天综合| 99爱视频在线观看| 色亚洲激情| 五月婷婷激情综合网 | 久久538| 五月婷婷丁香| 五月婷丁香| 伊人久久婷婷| 五月天激情国产综合婷婷婷| 亚洲精品久久久久AV无码| 亚洲精品一区中文字幕乱码| 国产高潮A片羞羞视频涩涩| 中文字幕欧美日韩VA免费视频| 开心五月婷婷| 国产精产国品一二三在观看| 中文字幕日产A片在线看| 风流少妇A片一区二区蜜桃| 国产午夜精品AV一区二区麻豆| 老师的粉嫩小又紧水又多A片视频 欧美三级巜人妻互换 | 乱岳熟女50岁| 日产精品一线二线三线芒果| 国产婷婷色综合AV蜜臀AV | 性爱久久| 日产精品久久久久久久蜜臀| 国产一区二区av免费| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 伊人色欲五月天| 天天综合五月| 久色姿源| 丁香五月激情图片| 色色性爱视频| 色噜噜狠狠色综合网| 色色婷婷五月天| 99热免费| 99久久九九视频| 九月婷婷综合色干| 丁香五月亚洲综合| 丁香婷婷婷五月综合色情| 色女人久久| 啪啪色激情五月天| xx综合网| 深爱五月日韩| 日本色婷婷| 99热超碰在线| 99ri在线视频| XX色综合| 五月色情| 五月婷婷97| 婷婷五月天奸女| 亚洲VA欧美VA| 婷婷激情5月| 操骚货在线| 久热婷婷| 九九视频在线观看视频6| 在线成人国产| 99ri国产在线| 99在线爽| 激情五月婷婷色播网| 丁香五月五婷| 欧美三日本三级少妇三99| 成人性爱无码| 天天综合五月| 天天干天天操天天爽| 日韩久久成人| 99九九中文字幕视频| 久久久人妻人伦| 色色婷婷综合网| 天天做天天爽| 97色色婷婷| 国产69久久久欧美黑人A片| 超爽内射| 九九色综合| 毛片新网地| 色婷另类| 五月天社区| 久久久久久久11111111111| 久久久A级视频| 婷婷五月情| 另类小说五月天综合网| www热久久yy9| 亚洲亚洲人成综合网络| 亚洲欧美成人在线观看| 亚洲无线视频| 亚洲五月天综合| 久久精品亚洲一级牲爱综合| 91九色国产| AV在线不卡播放| 激情99| 99精品视频在线| 五月丁香黄色视频| 婷婷五月天丁香| 日韩中出视频| 婷婷五月综合色拍| 夜夜噜夜夜奇| 99热亚洲精品| 久久人妻少妇嫩草AV| 亚洲免费观看高清完整版AV线| www.91.com处女在线直播| 欧洲亚洲精品| 色五月婷婷亚洲| 久久182| 狠狠操天天操| 五月激情小说| 丰满少妇乱A片无码| 97se视频在线| 99热这里只有精品33| www,色婷婷| 天天色情站| WWW.久久久久久久| 九九婷婷五月天影视| 97色久| 黄色av高清| 亚洲视频a| 99综合视频| 五月天激情综合网| 99热丁香| 婷婷五月激情欧美大胆视频| 久久性爱视频| 人操91在线| 国产阿姨日皮艹逼内射视频| 26uuu丁香婷婷五月| 一点色成人网| 开心五月婷婷激情| 天天操天天操天天操天天操天天操| 亚洲亚洲人成综合网络| www999日韩精品| 色五月亚洲开心网| 在线播放成人网站| 色综合久久综合| 婷婷丁香激情五月天色色| www色五月| av线电影| 。久久久久久久久久久久久久人妻 | 色色综合网。| 激情六月丁香综合| 影音先锋激情网| 五月 成人 婷婷| 9l视频自拍九色9l黑人| 狠狠夜夜五月丁香| 热久久91| 丁香激情五月少妇| 综合网五月天123| 狠狠综合| 香蕉久久国产av一区二区| 五月婷婷激情综合视频| 亚洲亚洲人成综合网络| 97人妻碰碰碰久| 影音先锋天天日| 99精品久久久久久久久| 狠狠色丁香99| 九九精品免费| 99在线视频精品| 99爱视频在线| 在线视频九色97| 色国产五月| 久久资源网五月婷| 任你擦免费视频| 九九热在线99| 亚洲超碰青涩| 狠狠色激情在线| 天天综合精品| 婷婷亚洲影院| 国产精品久久久久久白浆色欲| 五月丁香毛片| 99热免| 亚洲欧美成人在线观看| 天天模,夜夜模夜夜爽| 丁香九月激情| av 一区三区四区| 99热91| 婷婷五月激情欧美| 五月天婷婷AV| 第五婷婷伊人丁香| 五月天精品视频| 日韩精品一曲二曲三曲四曲五曲| 99热精国产这里只有精品| 99精品成人无码A片观看金桔| 26UUU一区二区| 欧美一级色| 九月丁香婷婷综合| 丰满熟女人妻一区二区三 | 国产精品国产成人国产三级 | 我想看国产大学生口爆吞精的视频| 婷婷激情五月天小说校园| yazhoujiqingav| 天色综合网站| 国产成人精品一区二三区熟女在线| 成人精品一区二区三区四区五区| 9久热| 伊人久久大香线蕉av最新| www色五月| 色玖玖爱| 婷婷伊人网| 五月婷婷欧美| 大香蕉综合网| 丁香婷婷五月综合影院| 超碰人人超碰| 色停停香蕉视频| 91久久1118| www.99在线| 色五月婷婷亚洲| 天天爱天天做天天日| 久热大香蕉| 操国产人妻| 开心五月色婷婷综合开心网| VA国产在线综合网站| 色婷婷成人做爰A片免费看网站| 天天性视频| 少妇性按摩无码中文A片| 开心五月婷婷六月丁香| 亚洲日韩乱码一区二区三区四区| 五月丁香五月激情综合色综合| 久热婷婷综合| 激情色情五月天| 狠狠综合网| WWW夜夜| 无码少妇高潮喷水A片免费| 婷婷六月天精品| 亚洲网综合在线| www婷婷色情网| 日日操夜夜操中国无码| 79精品视频在线观看,| 亚洲成人网站在线| 五月婷网| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 九久九精品| 怡红院精品视频久久久久久久久| 亚洲中文AV网站| 日本色爽| 99综合一区| 26UUU精品一区二区| 99热精在线九九久久保| 五月丁香激情综合| 久久这里有精品在线观看| 日本天堂久久| 成人精品人妻| 天天五月丁香五月| 欧美 日韩 人妻 高清 中文| 79色色色色| 黑人无码一区| 色欲色香综合网| 日本婷婷综合精品| 99综合97| 五月激情影院| 婷婷六月色| 午夜成人片400| 五月激情婷婷开心| 久久五月天免费网站| 五月丁香无码| 丁香五月婷婷综合视频| 久久性综合| 日韩aaaaa| 人人草成人视频| 六月五月天婷婷涩播在线| 五月婷婷六月丁香色| 亚洲AV中文在线| A久久| 91久久婷婷人人澡草| 色九月婷婷丁香| 久久人人看| 夜夜骑福利资源| 操97免费超级视频| 久久久久婷婷| 婷婷五月天男人影院色色网| WWW久| 天天射影院| 狠狠狠五月婷婷六月丁香| 色欲色香,www,com| 99精品久久| 天天操天天日天天爽| 激情亭亭五月| 337p大胆噜噜噜噜噜91Av| 停停五月天激情网| 亚洲精品亚洲人成人网| 精品香蕉99久久久久网站| 天天操天天操天天操天天操天天操 | 亚洲精品久久久久久久久久飞鱼 | 996热re视频精品视频这里| 99成人免费热视频| 婷婷精品在线| 五月天欧美 另类小说| 超碰在线资源| 玖玖综合网| 。久久久久久久久久久久久久人妻| 久久久久久久久久久97| 99色婷婷| 99爱视频在线| 婷婷丁香视频在线观看免费| 丁香婷婷五月激情四射网| 99热在线精品观看| 日日操日日爽| 大香蕉五月天婷婷| 五月婷婷 婷婷五月 一区二区 久久久| 久久综合影院 | 久9热视频在线观看| 日韩欧美成人网| 另类少妇人与禽zOZZ0性伦| 五月天激情图片| 综合99久久| z色五月播播久久| 99精品视频免费| 五月丁香在线婷婷美女| 美女激情婷婷| 99爱视频精品在线观看| 色色五月天婷婷| www.婷婷五月| 伊人久久婷| 91九色在线视频| 91久久久久久久久久| 六月大香蕉| 婷婷色在线播放| 综合九九中文字幕| 久婷自拍视频| 麻豆精品| 亚洲愉拍99热成人精品| 久久综合丁香| 色噜噜狠狠色综合成人网| 99久久精品国产色欲| 六月激情丁香一道本7777| 婷婷六月成人| 久超免费视频| 色婷综合| 色色五月丁香婷婷综合| 热婷婷在线视频| 丁香五月瑟瑟| 2015WWW永久免费观看播放| 超碰在线94| 99爱爱网| 欧美色色色色色| 丁香五月天狠狠操| 色五月天.con| 日韩狠狠色婷婷| www.丁香黄色五月天人与| 久久开心五月婷婷| ss99热| 99热这里只有精品3| 女人被男人吃奶到高潮| 丁香婷婷五月色成人网站| 久久永久视频| 国产这里只有精品| www.金莲av| 大香蕉娱乐| 9999三级片| 六月丁香婷婷综合色播| 五月色 亚洲| 成人丁香| 五月婷婷影| 荡乳尤物3HP1V5| 99热最新国内| 丁香五月天操B| 五月丁香六月激情综合| 婷婷五月激情热播| 久久人妻系列| 婷婷激情图片| 狠狠狠狠狠| 久久男人网婷婷| www..999热久| 九九99在线免费在线观看视频| 丁香婷婷久| 丁香五月天AV在线 | 狠狠干天天日| 九九色综合网| 99精彩视频| 狠狠激情五月天| 天天天天天操| 欧美激情五月综合| 丁香五月婷婷激情网| 久9精品| 99天堂网最新| 色色色五月| 玖玖婷婷色欲| 精品一二三区久久AAA片| 丁香婷婷大香蕉| 五月丁香综合激情网| 玖玖午夜视频| 激情五月天偷拍综合网| 桔色成人在线| 婷婷五月噜噜| 亚洲色婷婷网站| 99热 在线观看| www.粉嫩av.com| 操一区| 9l视频自拍九色9l视频在线观看| 999久久久国产精品| 激情淫乱男女| 亚洲啪啪自拍| 激情电影五月婷婷| 91人无码久久久久久| 99日热在线视频| 99人人爽| 激情五月天天| 影音先锋美国A| 精品人妻午夜一区二区三区四区| 精品无码久久久久久久久| 99re在线观看| 大香蕉婷婷| 亚洲另类电影| 色婷婷导航| 久狠狠| 色综合久久中文| 久久色五月| 91成人看片| 久久a热| 午夜婷婷久久 | 俺五月| 五月天在线视频尤物视频在线看| 五月激情婷婷播播网| 深爱五月天 开心网| tingtingzonghewang| 丁香五月综合图片在线观看| 天天上天天爽| 亚洲尤物在线| 日韩精品色| 久久成人综合五月天| 国产色五月| 欧美日韩AAAA| 欧美中文五月天| 激情五月丁香六月综合AVXXXX| 色婷婷六月| 久久婷婷久久| 999热在线视频| 日韩1区2区| 色五月激情五月| 日韩色色色色| 丁香五月瑟瑟| 日本99婷婷| A级毛片高清免费不卡播放谢谢谢谢| 日本女人久久| 五月丁香婷婷色色| 五月天婷婷六月激情网| 天天干狠狠操|