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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Scons环境搭建和编译原理概述及嵌入式开发常用模板

發(fā)布時(shí)間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scons环境搭建和编译原理概述及嵌入式开发常用模板 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Scons環(huán)境搭建和編譯原理概述及嵌入式開(kāi)發(fā)常用模板

????????Scons是用python實(shí)現(xiàn)的一個(gè)類(lèi)似makefile的軟件構(gòu)建工具。其官網(wǎng)是SCons: A software construction tool - SCons,其具有詳細(xì)的文檔來(lái)對(duì)其使用進(jìn)行說(shuō)明SCons Documentation。

????????Scons是一個(gè)軟件構(gòu)建工具,除了能對(duì)c/c++/asm進(jìn)行構(gòu)建外,也能實(shí)現(xiàn)對(duì)java等語(yǔ)言進(jìn)行構(gòu)建。因?yàn)槠涫怯胮ython來(lái)實(shí)現(xiàn)的,所以其具備跨平臺(tái)的特性。

????????本例程所有相關(guān)代碼在GitHub上,請(qǐng)自行下載。https://github.com/bobwenstudy/scons_demo

為什么用Scons

????????第一次接觸Scons是在RTThread中,進(jìn)一步了解它的特性,漸漸的就喜歡上了,平常自己寫(xiě)一些代碼,用Scons可以方便不少。對(duì)于我個(gè)人來(lái)說(shuō),主要的好處有:

????????實(shí)際項(xiàng)目中編譯工程時(shí),除了要對(duì)代碼進(jìn)行編譯生成固件外,還需要整合一些其他資源(如編譯耳機(jī)項(xiàng)目時(shí),需要講提示音等wav資源打包進(jìn)代碼中;多固件合并打包之類(lèi)。)之前完成這些動(dòng)作是用python寫(xiě)的,當(dāng)然能用makefile調(diào)用,但是相比Scons本身就是python,同一套環(huán)境調(diào)試起來(lái)會(huì)方便不少。

????????易讀性,相比于makefile這么久遠(yuǎn)的構(gòu)建語(yǔ)言,Scons是python寫(xiě)的,其語(yǔ)法和調(diào)試起來(lái)更方便,函數(shù)調(diào)用和可讀性都比makefile好。

????????文件依賴,使用makefile時(shí),由于經(jīng)常編譯的時(shí)候只將c文件作為依賴,而沒(méi)有將h文件作為依賴,或其他資源,導(dǎo)致部分h文件更新時(shí),經(jīng)常要考慮先make clean,再make all。而Scons可以自動(dòng)將關(guān)聯(lián)的文件作為依賴,并構(gòu)建依賴樹(shù),不用考慮太多就可以自動(dòng)將相關(guān)依賴關(guān)系給維護(hù)好,當(dāng)文件更新再次編譯時(shí),只編譯特定文件。同時(shí)可以通過(guò)Depends指定依賴關(guān)系。

????????缺點(diǎn)也有:

????????集成度太強(qiáng):Scons內(nèi)部做了太多事情,對(duì)于我這種掌控欲比較強(qiáng)的程序猿來(lái)說(shuō),有點(diǎn)脫離掌控了,雖然方便,但是當(dāng)構(gòu)建大型項(xiàng)目時(shí),內(nèi)部一些行為可能導(dǎo)致debug很長(zhǎng)時(shí)間,需要我們對(duì)其原理進(jìn)行深入分析。

????????資料較少:畢竟是新語(yǔ)言,現(xiàn)在很多新語(yǔ)言很快的死在沙灘上了,對(duì)于新語(yǔ)言,大家或多或少保持觀望態(tài)度,所以目前資料還是比較少的。遇到bug得自己看官方手冊(cè),還是有點(diǎn)麻煩的。

環(huán)境搭建

????????從上面描述可知,Scons類(lèi)似于makefile,但并不是替代了GCC,只是實(shí)現(xiàn)了對(duì)GCC的使用。按照makefile的邏輯,需要準(zhǔn)備如下環(huán)境:

GCC環(huán)境:筆者是Windows環(huán)境,所以需要msys64+mingw工具鏈。

Scons環(huán)境:python環(huán)境安裝后,再安裝scons就行。

GCC環(huán)境

PC下的GCC環(huán)境安裝
????????參考這個(gè)文章安裝即可。Win7下msys64安裝mingw工具鏈 - Milton - 博客園

安裝完以后,鍵入gcc -v,得到如下提示說(shuō)明環(huán)境安裝好了,目前筆者用的是mingw32的gcc。

ARM下的GCC環(huán)境安裝

????????從各個(gè)芯片產(chǎn)商都可以獲取到對(duì)應(yīng)的交叉工具鏈,筆者的交叉工具鏈解壓縮后,就有g(shù)cc環(huán)境,一般交叉工具鏈會(huì)有前綴。

????????安裝完以后,鍵入arm-none-eabi-gcc -v,出現(xiàn)如下信息就代表安裝成功了。

?

Scons環(huán)境

Python安裝

????????Scons是運(yùn)行在python環(huán)境下的,目前新版本的都運(yùn)行在Python3+的版本上,就不建議安裝Python2的環(huán)境了(當(dāng)然也可以用Python2就是了,不過(guò)最新的pip已經(jīng)不支持Python2了,希望大家早點(diǎn)切換)。

????????網(wǎng)上有很多教程了,Python安裝教程-史上最全_壬杰的博客-CSDN博客_python安裝教程可以參考這個(gè),當(dāng)然也可以直接到Welcome to Python.org下載。

????????最終安裝結(jié)束后,鍵入python -V,能看到python版本,代表環(huán)境安裝好了。

?

Scons安裝

????????使用python -m pip install scons即可。當(dāng)然可以到官網(wǎng)看看SCons DownloadsSCons DownloadsSCons Downloads。

????????最終安裝結(jié)束后,鍵入scons -v,能看到如下信息,代表環(huán)境安裝好了。

初識(shí)Scons

基本概述

????????要講清楚Scons,需要理解gcc是如何使用的,已經(jīng)相比于make,scons的行為差異。首先對(duì)gcc、make和scons基本概念進(jìn)行說(shuō)明。

gcc
????????實(shí)際編譯c文件的動(dòng)作都是由gcc來(lái)完成的,scons/make等構(gòu)建語(yǔ)言只是完成了對(duì)多個(gè)編譯文件和編譯目標(biāo)的調(diào)度管理,本身不完成編譯文件的動(dòng)作。

????????c編譯原理的概念很多大佬已經(jīng)講得比較多了,可以參考:C編譯原理_daixiao3636的博客-CSDN博客_c編譯原理。當(dāng)然現(xiàn)在要編譯文件也很簡(jiǎn)單了,一般我們只用2步,一個(gè)是通過(guò)gcc -c -o生成object文件,然后再將object文件gcc -o生成目標(biāo)文件。

make
????????使用的換需要安裝make環(huán)境,一般安裝好mingw的時(shí)候,就自動(dòng)裝好了make+gcc環(huán)境,需要注意的是,新版裝好后沒(méi)有make.exe,而是:mingw32-make.exe,可以復(fù)制一份,并修改文件名為make.exe,以方便后面使用。

?

make使用可以直接在終端上使用,鍵入make -v,看到如下信息,說(shuō)明make環(huán)境安裝成功了。?

執(zhí)行make,會(huì)去尋找文件:GNUmakefile、makefile 和 Makefile。詳細(xì)可以見(jiàn):認(rèn)識(shí)Makefile文件_天糊土的博客-CSDN博客_makefile文件在哪

Scons

????????之前已經(jīng)安裝好了scons環(huán)境,要使用scons,和make類(lèi)似,也需要一個(gè)腳本文件,配置要執(zhí)行的操作。文件名為:SConstruct

?

單文件構(gòu)建

gcc編譯

????????單個(gè)文件編譯,gcc直接命令行操作就行,兩行命令就可以搞定(當(dāng)然1條命令也可以,這里為了統(tǒng)一,都要求先生成object文件,再生成目標(biāo)文件)。

?

main.c的源碼如下:?

#include <stdio.h> int main() {printf("hello, world\n");return 0; }

make編譯

????????如圖所示,第一次編譯的時(shí)候,編譯目標(biāo)all依賴main.o,由于沒(méi)有main.o,先對(duì)main.c進(jìn)行編譯,生成main.o,最后生成最終目標(biāo)。第二次編譯時(shí),由于main.c沒(méi)改變,自然main.o不需要改變,所以只需要執(zhí)行all所對(duì)應(yīng)的指令,生成目標(biāo)main。

????????clean清除完環(huán)境后,再次make all,所有的操作都重新來(lái)過(guò)。

Makefile的源碼如下:?

all: main.ogcc main.o -o main main.o: main.cgcc main.c -c -o main.o clean:rm main.o main.exe

Scons編譯

????????如下圖所示是一個(gè)簡(jiǎn)易的scons編譯行為,可以看到,腳本寫(xiě)的時(shí)候只需配置好源文件和目標(biāo)文件source=main.c target=main,直接執(zhí)行scons就可以,第二次編譯的時(shí)候,由于什么都沒(méi)變化scons不執(zhí)行任何操作。

????????相比于make,清空環(huán)境只需要執(zhí)行scons -c就可以自動(dòng)清除編譯生成的文件,無(wú)需像make要指定所有目標(biāo)。而后再次編譯又會(huì)重新開(kāi)始了。

?scons源碼如下:

obj = Object('main.c') Program('main', obj)

總結(jié)

????????gcc直接操作,每次編譯都需要輸入所有command,不能自動(dòng)識(shí)別文件哪些有改動(dòng),只編譯所需的文件,對(duì)于大型工程來(lái)說(shuō),編譯時(shí)間還是很長(zhǎng)的,只編譯有修改的文件還是很方便的。

????????make解決了gcc的缺點(diǎn),每次編譯只需要執(zhí)行make all,刪除執(zhí)行make clean就可以,但是寫(xiě)makefile的人需要知曉所有的中間文件,并了解文件的依賴關(guān)系。

????????scons保留了make的優(yōu)點(diǎn),每次編譯只需要執(zhí)行scons,刪除執(zhí)行scons -c就可以。同時(shí)寫(xiě)Sconstruct也更為輕松,不需要了解中間文件是什么,也不用專(zhuān)門(mén)寫(xiě)一個(gè)clean操作。所有的事情交給scons就行。

帶.h文件的構(gòu)建

gcc編譯

????????多個(gè)文件編譯的時(shí)候,先將2個(gè)文件生成object文件,再將2個(gè)object文件編譯成目標(biāo)main.exe。

main.c的源碼如下:?

#include <stdio.h> #include "test.h" int main() {printf("hello, world\n");test_work();return 0; }

test.c的源碼如下:

#include <stdio.h> #include "test.h" void test_work(void) {printf(TEST_PRINT_STRING); }

test.h的源碼如下:

#ifndef _TEST_H_ #define _TEST_H_#define TEST_PRINT_STRING "Test_Origin_0" void test_work(void);#endif //_TEST_H_

make編譯

????????按照流程寫(xiě)好,這里需要注意的是,修改完test.h后,再次編譯的時(shí)候make只再次生成了main.exe,并沒(méi)有重新編譯test.o和main.o,并沒(méi)有達(dá)到我們的目標(biāo)。

????????這是因?yàn)槲覀兊膍akefile沒(méi)寫(xiě)好,沒(méi)把test.h依賴關(guān)系給寫(xiě)好。

????????將makefile修改一下,這時(shí)候再次修改test.h文件,make就知道需要重新編譯文件了(大型項(xiàng)目通常通過(guò)-MMD -MP來(lái)生成.h的依賴樹(shù))。

????????注意,這個(gè)問(wèn)題是我們寫(xiě)makefile經(jīng)常遇到的問(wèn)題,這個(gè)還存在更換之類(lèi)的場(chǎng)景下,依賴關(guān)系沒(méi)寫(xiě)好,導(dǎo)致再次編譯的時(shí)候沒(méi)將所有改動(dòng)給編譯進(jìn)去,通常要先make clean再make all,完全喪失了make只編譯改動(dòng)的特點(diǎn),導(dǎo)致編譯效率大大降低。

?

Makefile的源碼如下:?

all: main.o test.ogcc main.o test.o -o main main.o: main.c test.hgcc main.c -c -o main.o test.o: test.c test.hgcc test.c -c -o test.o clean:rm main.o test.o main.exe

Scons編譯

????????scons的腳本依然很簡(jiǎn)單,配置好objects所需的源文件,在配置好目標(biāo),執(zhí)行scons就可以了。需要注意的是,我們并沒(méi)有顯示的聲明test.h的依賴關(guān)系,當(dāng)修改test.h后再次編譯,scons就能知道文件間的依賴關(guān)系,將整個(gè)工程正確的重新編譯了,這對(duì)于寫(xiě)Sconstruct的人要求大大降低。

?

SConstruct源碼如下:

objs = Object('main.c') objs += Object('test.c') Program('main', objs)

總結(jié)

????????在包含.h文件等多種隱示依賴的情況下,scons無(wú)需開(kāi)發(fā)人員了解編譯的底層原理,只需要將所需編譯的主文件配置好,并配置好目標(biāo),剩下scons都可以自動(dòng)搞定,大大節(jié)約了工程人員的開(kāi)發(fā)和維護(hù)成本。

Scons原理分析

????????從上一章的分析可以看出,scons保留了make的所有優(yōu)點(diǎn),并簡(jiǎn)化了腳本編譯,同時(shí)很好的維護(hù)了各個(gè)文件的隱示依賴關(guān)系,避免大家每次都要make clean,再make all了。

????????這一章我們簡(jiǎn)單分析下Scons是如何工作的。

腳本如何運(yùn)行

????????沒(méi)時(shí)間細(xì)看代碼,自己也寫(xiě)過(guò)一些測(cè)試環(huán)境之類(lèi),大體猜測(cè)Scons的運(yùn)行機(jī)制就是將Sconstruct文件用exec函數(shù)來(lái)執(zhí)行,這樣才能只寫(xiě)部分代碼就可以完成編譯工作。

????????簡(jiǎn)單搜索了下源碼Sconstruct,可以看到_SConstruct_exists函數(shù)會(huì)去用這個(gè)文件。

?之后有用python的exec函數(shù)來(lái)執(zhí)行這個(gè)文件。

?

如何指導(dǎo)編譯

????????如果學(xué)習(xí)過(guò)make的語(yǔ)法,其核心語(yǔ)法就是目標(biāo)和依賴,利用好其基本語(yǔ)法,再借助其強(qiáng)大的工具函數(shù),就可以完成項(xiàng)目的編譯管理工作。

????????scons和make一樣,本質(zhì)并不會(huì)去做gcc的工作,更多是管理工程文件如何依次調(diào)用gcc進(jìn)行編譯

????????要用scons實(shí)現(xiàn)大型項(xiàng)目的管理,也必須理解其底層運(yùn)行機(jī)制,這樣才能實(shí)現(xiàn)各種復(fù)雜的行為。直接學(xué)習(xí)其源碼是可以的,但是太累了,直接看其文檔也能看到一些,但是也不是特別清楚,所以這里筆者以自己淺顯的理解來(lái)分析其行為。

????????從上面的說(shuō)明例子中,簡(jiǎn)單的c項(xiàng)目編譯,只需要指定Object所需的source文件,然后再指定Program所需的objs和target對(duì)象,剩下都是scons來(lái)完成的。那么我們依次拆分其操作行為。

打印環(huán)境信息env.Dump()

????????scons所有的配置參數(shù)和信息存儲(chǔ)在Environment對(duì)象中,可以通過(guò)Dump方法可以打印當(dāng)前scons的所有配置參數(shù),而后用python的print方法就可以打印出來(lái)了。

????????官方手冊(cè)上也有說(shuō)明:

env = Environment() print(env.Dump())

?

????????打印出來(lái)的信息如下所示,參數(shù)有很多,看不懂咋辦。

????????目前只需要完成嵌入式C開(kāi)發(fā)需要,只要認(rèn)下面幾個(gè)關(guān)鍵字:

  • C編譯:CC和CCCOM

  • ASM編譯:AS和ASCOM

  • 鏈接:LINK和LINKCOM

scons: Reading SConscript files ... { 'AR': 'ar','ARCOM': '$AR $ARFLAGS $TARGET $SOURCES','ARFLAGS': ['rc'],'AS': 'as','ASCOM': '$AS $ASFLAGS -o $TARGET $SOURCES','ASFLAGS': [],'ASPPCOM': '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o ''$TARGET $SOURCES','ASPPFLAGS': '$ASFLAGS','BUILDERS': { 'CopyAs': <SCons.Builder.BuilderBase object at 0x000001F3D9B0C7F0>,'CopyTo': <SCons.Builder.BuilderBase object at 0x000001F3D9B0C7C0>,'JarFile': <SCons.Builder.BuilderBase object at 0x000001F3D9B0C910>,'JavaClassDir': <SCons.Builder.BuilderBase object at 0x000001F3D9B0CC10>,'JavaClassFile': <SCons.Builder.BuilderBase object at 0x000001F3D9B0CB50>,'JavaFile': <SCons.Builder.CompositeBuilder object at 0x000001F3D9B0CA60>,'Library': <SCons.Builder.BuilderBase object at 0x000001F3D9ACAA10>,'LoadableModule': <SCons.Builder.BuilderBase object at 0x000001F3D9ACA680>,'M4': <SCons.Builder.BuilderBase object at 0x000001F3D9B0C4C0>,'Object': <SCons.Builder.CompositeBuilder object at 0x000001F3D9AC9360>,'Program': <SCons.Builder.BuilderBase object at 0x000001F3D9AC9900>,'ProgramAllAtOnce': <SCons.Builder.BuilderBase object at 0x000001F3D9B0C6D0>,'RES': <SCons.Builder.BuilderBase object at 0x000001F3D9A2ECB0>,'RMIC': <SCons.Builder.BuilderBase object at 0x000001F3D9A89930>,'SharedLibrary': <SCons.Builder.BuilderBase object at 0x000001F3D9ACA290>,'SharedObject': <SCons.Builder.CompositeBuilder object at 0x000001F3D9AC95A0>,'StaticLibrary': <SCons.Builder.BuilderBase object at 0x000001F3D9ACAA10>,'StaticObject': <SCons.Builder.CompositeBuilder object at 0x000001F3D9AC9360>,'Substfile': <SCons.Builder.BuilderBase object at 0x000001F3D9AC8FD0>,'Tar': <SCons.Builder.BuilderBase object at 0x000001F3D9A8AB60>,'Textfile': <SCons.Builder.BuilderBase object at 0x000001F3D9AC8F70>,'Zip': <SCons.Builder.BuilderBase object at 0x000001F3D9A8AEC0>},'CC': 'gcc','CCCOM': '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES','CCDEPFLAGS': '-MMD -MF ${TARGET}.d','CCFLAGS': [],'CCVERSION': '12.1.0','CFILESUFFIX': '.c','CFLAGS': [],'CONFIGUREDIR': '#/.sconf_temp','CONFIGURELOG': '#/config.log','COPYSTR': 'Copy file(s): "$SOURCES" to "$TARGETS"','CPPDEFPREFIX': '-D','CPPDEFSUFFIX': '','CPPSUFFIXES': [ '.c','.C','.cxx','.cpp','.c++','.cc','.h','.H','.hxx','.hpp','.hh','.F','.fpp','.FPP','.m','.mm','.S','.spp','.SPP','.sx'],'CXX': 'g++','CXXCOM': '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES','CXXFILESUFFIX': '.cc','CXXFLAGS': [],'CXXVERSION': '12.1.0','DC': 'dmd','DCOM': '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET ''$SOURCES','DDEBUG': [],'DDEBUGPREFIX': '-debug=','DDEBUGSUFFIX': '','DFILESUFFIX': '.d','DFLAGPREFIX': '-','DFLAGS': [],'DFLAGSUFFIX': '','DINCPREFIX': '-I','DINCSUFFIX': '','DLIB': 'lib','DLIBCOM': '$DLIB $_DLIBFLAGS -c $TARGET $SOURCES $_DLIBFLAGS','DLIBDIRPREFIX': '-L-L','DLIBDIRSUFFIX': '','DLIBFLAGPREFIX': '-','DLIBFLAGSUFFIX': '','DLIBLINKPREFIX': '','DLIBLINKSUFFIX': '.lib','DLINK': '$DC','DLINKCOM': '$DLINK -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS ''$_DLIBFLAGS','DLINKFLAGS': [],'DPATH': ['#/'],'DRPATHPREFIX': '-L-rpath=','DRPATHSUFFIX': '','DSUFFIXES': ['.d'],'DVERPREFIX': '-version=','DVERSIONS': [],'DVERSUFFIX': '','Dir': <SCons.Defaults.Variable_Method_Caller object at 0x000001F3D93C82E0>,'Dirs': <SCons.Defaults.Variable_Method_Caller object at 0x000001F3D93C8370>,'ENV': { 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe','PATH': 'C:\\Windows\\System32;C:\\msys64\\mingw32\\bin','PATHEXT': '.COM;.EXE;.BAT;.CMD','SystemDrive': 'C:','SystemRoot': 'C:\\Windows','TEMP': 'C:\\Users\\wenbo\\AppData\\Local\\Temp','TMP': 'C:\\Users\\wenbo\\AppData\\Local\\Temp','USERPROFILE': 'C:\\Users\\wenbo'},'ESCAPE': <function escape at 0x000001F3D9519B40>,'F03': 'gfortran','F03COM': '$F03 -o $TARGET -c $FORTRANCOMMONFLAGS $F03FLAGS $_F03INCFLAGS ''$_FORTRANMODFLAG $SOURCES','F03FLAGS': [],'F03PPCOM': '$F03 -o $TARGET -c $FORTRANCOMMONFLAGS $F03FLAGS $CPPFLAGS ''$_CPPDEFFLAGS $_F03INCFLAGS $_FORTRANMODFLAG $SOURCES','F08': 'gfortran','F08COM': '$F08 -o $TARGET -c $FORTRANCOMMONFLAGS $F08FLAGS $_F08INCFLAGS ''$_FORTRANMODFLAG $SOURCES','F08FLAGS': [],'F08PPCOM': '$F08 -o $TARGET -c $FORTRANCOMMONFLAGS $F08FLAGS $CPPFLAGS ''$_CPPDEFFLAGS $_F08INCFLAGS $_FORTRANMODFLAG $SOURCES','F77': 'gfortran','F77COM': '$F77 -o $TARGET -c $FORTRANCOMMONFLAGS $F77FLAGS $_F77INCFLAGS ''$SOURCES','F77FLAGS': [],'F77PPCOM': '$F77 -o $TARGET -c $FORTRANCOMMONFLAGS $F77FLAGS $CPPFLAGS ''$_CPPDEFFLAGS $_F77INCFLAGS $SOURCES','F90': 'gfortran','F90COM': '$F90 -o $TARGET -c $FORTRANCOMMONFLAGS $F90FLAGS $_F90INCFLAGS ''$_FORTRANMODFLAG $SOURCES','F90FLAGS': [],'F90PPCOM': '$F90 -o $TARGET -c $FORTRANCOMMONFLAGS $F90FLAGS $CPPFLAGS ''$_CPPDEFFLAGS $_F90INCFLAGS $_FORTRANMODFLAG $SOURCES','F95': 'gfortran','F95COM': '$F95 -o $TARGET -c $FORTRANCOMMONFLAGS $F95FLAGS $_F95INCFLAGS ''$_FORTRANMODFLAG $SOURCES','F95FLAGS': [],'F95PPCOM': '$F95 -o $TARGET -c $FORTRANCOMMONFLAGS $F95FLAGS $CPPFLAGS ''$_CPPDEFFLAGS $_F95INCFLAGS $_FORTRANMODFLAG $SOURCES','FORTRAN': 'gfortran','FORTRANCOM': '$FORTRAN -o $TARGET -c $FORTRANCOMMONFLAGS $FORTRANFLAGS ''$_FORTRANINCFLAGS $_FORTRANMODFLAG $SOURCES','FORTRANFLAGS': [],'FORTRANMODDIR': '','FORTRANMODDIRPREFIX': '-J','FORTRANMODDIRSUFFIX': '','FORTRANMODPREFIX': '','FORTRANMODSUFFIX': '.mod','FORTRANPPCOM': '$FORTRAN -o $TARGET -c $FORTRANCOMMONFLAGS $FORTRANFLAGS ''$CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS $_FORTRANMODFLAG ''$SOURCES','FORTRANSUFFIXES': [ '.f','.for','.ftn','.F','.FOR','.FTN','.fpp','.FPP','.f77','.F77','.f90','.F90','.f95','.F95','.f03','.F03','.f08','.F08'],'FRAMEWORKPATH': [],'FRAMEWORKS': [],'File': <SCons.Defaults.Variable_Method_Caller object at 0x000001F3D93C83A0>,'HOST_ARCH': 'x86_64','HOST_OS': 'win32','IDLSUFFIXES': ['.idl', '.IDL'],'IMPLIBNOVERSIONSYMLINKS': True,'INCF03PREFIX': '-I','INCF03SUFFIX': '','INCF08PREFIX': '-I','INCF08SUFFIX': '','INCF77PREFIX': '-I','INCF77SUFFIX': '','INCF90PREFIX': '-I','INCF90SUFFIX': '','INCF95PREFIX': '-I','INCF95SUFFIX': '','INCFORTRANPREFIX': '-I','INCFORTRANSUFFIX': '','INCPREFIX': '-I','INCSUFFIX': '','JAR': 'jar','JARCOM': "${TEMPFILE('$_JARCOM','$JARCOMSTR')}",'JARFLAGS': ['cf'],'JARSUFFIX': '.jar','JAVABOOTCLASSPATH': [],'JAVAC': 'javac','JAVACCOM': "${TEMPFILE('$_JAVACCOM','$JAVACCOMSTR')}",'JAVACFLAGS': [],'JAVACLASSPATH': [],'JAVACLASSSUFFIX': '.class','JAVAINCLUDES': [],'JAVASOURCEPATH': [],'JAVASUFFIX': '.java','LDMODULE': '$SHLINK','LDMODULECOM': <SCons.Action.CommandGeneratorAction object at 0x000001F3D9A2E800>,'LDMODULEEMITTER': [ <function lib_emitter at 0x000001F3D93B4AF0>,<function ldmod_symlink_emitter at 0x000001F3D9AE8940>,<function shlib_emitter at 0x000001F3D9A5A290>],'LDMODULEFLAGS': '$SHLINKFLAGS','LDMODULENAME': '${LDMODULEPREFIX}$_get_ldmodule_stem${_LDMODULESUFFIX}','LDMODULENOVERSIONSYMLINKS': True,'LDMODULEPREFIX': '$SHLIBPREFIX','LDMODULESUFFIX': '$SHLIBSUFFIX','LDMODULEVERSION': '$SHLIBVERSION','LDMODULE_NOVERSION_SYMLINK': '$_get_shlib_dir${LDMODULEPREFIX}$_get_ldmodule_stem${LDMODULESUFFIX}','LDMODULE_SONAME_SYMLINK': '$_get_shlib_dir$_LDMODULESONAME','LIBDIRPREFIX': '-L','LIBDIRSUFFIX': '','LIBLINKPREFIX': '-l','LIBLINKSUFFIX': '','LIBPREFIX': 'lib','LIBPREFIXES': ['$LIBPREFIX'],'LIBSUFFIX': '.a','LIBSUFFIXES': ['$LIBSUFFIX'],'LINESEPARATOR': '\n','LINK': '$SMARTLINK','LINKCOM': '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS ''$_LIBFLAGS','LINKFLAGS': [],'M4': 'm4','M4COM': 'cd ${SOURCE.rsrcdir} && $M4 $M4FLAGS < ${SOURCE.file} > ''${TARGET.abspath}','M4FLAGS': ['-E'],'MAXLINELENGTH': 2048,'NINJA_DEPFILE_PARSE_FORMAT': 'gcc','OBJPREFIX': '','OBJSUFFIX': '.o','PLATFORM': 'win32','PROGPREFIX': '','PROGSUFFIX': '.exe','PSPAWN': <function piped_spawn at 0x000001F3D9519990>,'RANLIB': 'ranlib','RANLIBCOM': '$RANLIB $RANLIBFLAGS $TARGET','RANLIBFLAGS': [],'RC': 'windres','RCCOM': '$RC $_CPPDEFFLAGS $RCINCFLAGS ${RCINCPREFIX} ${SOURCE.dir} ''$RCFLAGS -i $SOURCE -o $TARGET','RCFLAGS': [],'RCINCFLAGS': '${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, ''TARGET, SOURCE, affect_signature=False)}','RCINCPREFIX': '--include-dir ','RCINCSUFFIX': '','RDirs': <SCons.Defaults.Variable_Method_Caller object at 0x000001F3D93C8430>,'RMIC': 'rmic','RMICCOM': '$RMIC $RMICFLAGS -d ${TARGET.attributes.java_lookupdir} ''-classpath ${SOURCE.attributes.java_classdir} ''${SOURCES.attributes.java_classname}','RMICFLAGS': [],'RPATHPREFIX': '-Wl,-rpath=','RPATHSUFFIX': '','SCANNERS': [<SCons.Scanner.ScannerBase object at 0x000001F3D9393C10>],'SHCC': '$CC','SHCCCOM': '$SHCC -o $TARGET -c $SHCFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES','SHCCFLAGS': ['$CCFLAGS'],'SHCFLAGS': ['$CFLAGS'],'SHCXX': '$CXX','SHCXXCOM': '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES','SHCXXFLAGS': ['$CXXFLAGS'],'SHDC': '$DC','SHDCOM': '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -fPIC ''-of$TARGET $SOURCES','SHDLINK': '$DC','SHDLINKCOM': '$DLINK -of$TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS ''$__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS','SHDLINKFLAGS': ['$DLINKFLAGS', '-shared', '-defaultlib=libphobos2.so'],'SHELL': 'C:\\Windows\\System32\\cmd.exe','SHF03': '$F03','SHF03COM': '$SHF03 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF03FLAGS ''$_F03INCFLAGS $_FORTRANMODFLAG $SOURCES','SHF03FLAGS': ['$F03FLAGS'],'SHF03PPCOM': '$SHF03 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF03FLAGS ''$CPPFLAGS $_CPPDEFFLAGS $_F03INCFLAGS $_FORTRANMODFLAG ''$SOURCES','SHF08': '$F08','SHF08COM': '$SHF08 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF08FLAGS ''$_F08INCFLAGS $_FORTRANMODFLAG $SOURCES','SHF08FLAGS': ['$F08FLAGS'],'SHF08PPCOM': '$SHF08 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF08FLAGS ''$CPPFLAGS $_CPPDEFFLAGS $_F08INCFLAGS $_FORTRANMODFLAG ''$SOURCES','SHF77': '$F77','SHF77COM': '$SHF77 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF77FLAGS ''$_F77INCFLAGS $SOURCES','SHF77FLAGS': ['$F77FLAGS'],'SHF77PPCOM': '$SHF77 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF77FLAGS ''$CPPFLAGS $_CPPDEFFLAGS $_F77INCFLAGS $SOURCES','SHF90': '$F90','SHF90COM': '$SHF90 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF90FLAGS ''$_F90INCFLAGS $_FORTRANMODFLAG $SOURCES','SHF90FLAGS': ['$F90FLAGS'],'SHF90PPCOM': '$SHF90 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF90FLAGS ''$CPPFLAGS $_CPPDEFFLAGS $_F90INCFLAGS $_FORTRANMODFLAG ''$SOURCES','SHF95': '$F95','SHF95COM': '$SHF95 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF95FLAGS ''$_F95INCFLAGS $_FORTRANMODFLAG $SOURCES','SHF95FLAGS': ['$F95FLAGS'],'SHF95PPCOM': '$SHF95 -o $TARGET -c $FORTRANCOMMONFLAGS $SHF95FLAGS ''$CPPFLAGS $_CPPDEFFLAGS $_F95INCFLAGS $_FORTRANMODFLAG ''$SOURCES','SHFORTRAN': '$FORTRAN','SHFORTRANCOM': '$SHFORTRAN -o $TARGET -c $FORTRANCOMMONFLAGS ''$SHFORTRANFLAGS $_FORTRANINCFLAGS $_FORTRANMODFLAG $SOURCES','SHFORTRANFLAGS': ['$FORTRANFLAGS'],'SHFORTRANPPCOM': '$SHFORTRAN -o $TARGET -c $FORTRANCOMMONFLAGS ''$SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS ''$_FORTRANMODFLAG $SOURCES','SHLIBEMITTER': [ <function lib_emitter at 0x000001F3D93B4AF0>,<function shlib_symlink_emitter at 0x000001F3D9AE8B80>,<function shlib_emitter at 0x000001F3D9A5A290>],'SHLIBNAME': '${_get_shlib_dir}${SHLIBPREFIX}$_get_shlib_stem${_SHLIBSUFFIX}','SHLIBNOVERSIONSYMLINKS': True,'SHLIBPREFIX': '','SHLIBSONAMEFLAGS': '-Wl,-soname=$_SHLIBSONAME','SHLIBSUFFIX': '.dll','SHLIB_NOVERSION_SYMLINK': '${_get_shlib_dir}${SHLIBPREFIX}$_get_shlib_stem${SHLIBSUFFIX}','SHLIB_SONAME_SYMLINK': '${_get_shlib_dir}$_SHLIBSONAME','SHLINK': '$LINK','SHLINKCOM': <SCons.Action.CommandGeneratorAction object at 0x000001F3D9A2E7A0>,'SHLINKCOMSTR': <function shlib_generator at 0x000001F3D9A59630>,'SHLINKFLAGS': ['$LINKFLAGS', '-shared'],'SHOBJPREFIX': '$OBJPREFIX','SHOBJSUFFIX': '.o','SMARTLINK': <function smart_link at 0x000001F3D93B4A60>,'SPAWN': <function spawn at 0x000001F3D9519AB0>,'STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME': 1,'SUBSTFILEPREFIX': '','SUBSTFILESUFFIX': '','TAR': 'tar','TARCOM': '$TAR $TARFLAGS -f $TARGET $SOURCES','TARFLAGS': ['-c'],'TARGET_ARCH': None,'TARGET_OS': None,'TARSUFFIX': '.tar','TEMPFILE': <class 'SCons.Platform.TempFileMunge'>,'TEMPFILEARGESCFUNC': <function quote_spaces at 0x000001F3D9252DD0>,'TEMPFILEARGJOIN': ' ','TEMPFILEPREFIX': '@','TEXTFILEPREFIX': '','TEXTFILESUFFIX': '.txt','TOOLS': [ 'default','mingw','gcc','g++','gnulink','ar','gas','gfortran','m4','dmd','filesystem','jar','javac','rmic','tar','zip','textfile'],'WINDOWSDEFPREFIX': '','WINDOWSDEFSUFFIX': '.def','WIXCANDLE': 'candle.exe','WIXLIGHT': 'light.exe','ZIP': 'zip','ZIPCOM': <SCons.Action.FunctionAction object at 0x000001F3D9A8ACB0>,'ZIPCOMPRESSION': 8,'ZIPFLAGS': [],'ZIPROOT': [],'ZIPSUFFIX': '.zip','_CCCOMCOM': '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS','_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__, ''TARGET, SOURCE)}','_CPPINCFLAGS': '${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, ''TARGET, SOURCE, affect_signature=False)}','_DDEBUGFLAGS': '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}','_DFLAGS': '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}','_DINCFLAGS': '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, ''TARGET, SOURCE)}','_DLIBDIRFLAGS': '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, ''RDirs, TARGET, SOURCE)}','_DLIBFLAGS': '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, ''LIBPREFIXES, LIBSUFFIXES, __env__)}','_DRPATH': '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}','_DVERFLAGS': '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}','_F03INCFLAGS': '${_concat(INCF03PREFIX, F03PATH, INCF03SUFFIX, __env__, ''RDirs, TARGET, SOURCE, affect_signature=False)}','_F08INCFLAGS': '${_concat(INCF08PREFIX, F08PATH, INCF08SUFFIX, __env__, ''RDirs, TARGET, SOURCE, affect_signature=False)}','_F77INCFLAGS': '${_concat(INCF77PREFIX, F77PATH, INCF77SUFFIX, __env__, ''RDirs, TARGET, SOURCE, affect_signature=False)}','_F90INCFLAGS': '${_concat(INCF90PREFIX, F90PATH, INCF90SUFFIX, __env__, ''RDirs, TARGET, SOURCE, affect_signature=False)}','_F95INCFLAGS': '${_concat(INCF95PREFIX, F95PATH, INCF95SUFFIX, __env__, ''RDirs, TARGET, SOURCE, affect_signature=False)}','_FORTRANINCFLAGS': '${_concat(INCFORTRANPREFIX, FORTRANPATH, ''INCFORTRANSUFFIX, __env__, RDirs, TARGET, SOURCE, ''affect_signature=False)}','_FORTRANMODFLAG': '$( ${_concat(FORTRANMODDIRPREFIX, FORTRANMODDIR, ''FORTRANMODDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)','_JARCOM': '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES','_JARFLAGS': <function jarFlags at 0x000001F3D9AB6EF0>,'_JARMANIFEST': <function jarManifest at 0x000001F3D9AB6E60>,'_JARSOURCES': <function jarSources at 0x000001F3D9AB5990>,'_JAVABOOTCLASSPATH': '${_javapathopt("-bootclasspath", ''"JAVABOOTCLASSPATH")} ','_JAVACCOM': '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ''${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES','_JAVACLASSPATH': '${_javapathopt("-classpath", "JAVACLASSPATH")} ','_JAVASOURCEPATH': '${_javapathopt("-sourcepath", "JAVASOURCEPATH", ''"_JAVASOURCEPATHDEFAULT")} ','_JAVASOURCEPATHDEFAULT': '${TARGET.attributes.java_sourcedir}','_LDMODULESONAME': <function _ldmodule_soname at 0x000001F3D9AE9000>,'_LDMODULESOVERSION': <function _ldmodule_soversion at 0x000001F3D9AE8F70>,'_LDMODULESUFFIX': '${LDMODULESUFFIX}${_LDMODULEVERSION}','_LDMODULEVERSION': <function _LDMODULEVERSION at 0x000001F3D9AE9090>,'_LDMODULEVERSIONFLAGS': '$LDMODULEVERSIONFLAGS -Wl,-soname=$_LDMODULESONAME','_LIBDIRFLAGS': '${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, ''RDirs, TARGET, SOURCE, affect_signature=False)}','_LIBFLAGS': '${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, ''LIBSUFFIXES, __env__)}','_RPATH': '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}','_SHDLIBVERSIONFLAGS': '$SHDLIBVERSIONFLAGS -L-soname=$_SHLIBSONAME','_SHLIBSONAME': <function _soname at 0x000001F3D9AE8CA0>,'_SHLIBSOVERSION': <function _soversion at 0x000001F3D9AE8C10>,'_SHLIBSUFFIX': '$SHLIBSUFFIX','_SHLIBVERSION': "${SHLIBVERSION and '.'+SHLIBVERSION or ''}",'_SHLIBVERSIONFLAGS': '$SHLIBVERSIONFLAGS -Wl,-soname=$_SHLIBSONAME','__DSHLIBVERSIONFLAGS': '${__libversionflags(__env__,"DSHLIBVERSION","_DSHLIBVERSIONFLAGS")}','__LDMODULEVERSIONFLAGS': '${__libversionflags(__env__,"LDMODULEVERSION","_LDMODULEVERSIONFLAGS")}','__SHLIBVERSIONFLAGS': '${__libversionflags(__env__,"SHLIBVERSION","_SHLIBVERSIONFLAGS")}','__lib_either_version_flag': <function __lib_either_version_flag at 0x000001F3D93B7250>,'__libversionflags': <function __libversionflags at 0x000001F3D93B6F80>,'_concat': <function _concat at 0x000001F3D93B6CB0>,'_defines': <function _defines at 0x000001F3D93B6EF0>,'_get_ldmodule_stem': <function _get_ldmodule_stem at 0x000001F3D9AE8EE0>,'_get_shlib_dir': <function _get_shlib_dir at 0x000001F3D9AE8DC0>,'_get_shlib_stem': <function _get_shlib_stem at 0x000001F3D9AE8D30>,'_javapathopt': <class 'SCons.Tool.javac.pathopt'>,'_stripixes': <function _stripixes at 0x000001F3D93B6DD0>} scons: done reading SConscript files. scons: Building targets ... scons: `.' is up to date. scons: done building targets.

C文件編譯行為分析

????????首先我們調(diào)整下編譯行為,注釋Program,只執(zhí)行Object,可以看到其最終執(zhí)行了gcc -o main.o -c main.c,那為什么其知道要使用這個(gè)命令呢?如果我需要加一些編譯參數(shù),應(yīng)該如何配置呢?如果要進(jìn)行嵌入式開(kāi)發(fā),需要替換gcc為aram-xx-gcc如何處理?

?????????從上文可知,scons是通過(guò)CCCOM來(lái)指導(dǎo)c文件編譯的。從官網(wǎng)上也可以看出是通過(guò)這個(gè)來(lái)完成對(duì)c的源文件編譯,生成object文件。

?????????通過(guò)dump可知,默認(rèn)配置下,各個(gè)參數(shù)如下:

  • TARGET:就是目標(biāo)文件
  • SOURCES:就是源文件列表
  • CFLAGS:通用C配置參數(shù)
  • CCFLAGS:通用C和C++公用的配置參數(shù),因?yàn)閟cons支持多個(gè)語(yǔ)言,配置了這個(gè)參數(shù),其同時(shí)會(huì)在C++編譯時(shí)使用。詳細(xì)可以參考:CXXCOM
  • _CCCOMCOM: 更多參數(shù)配置,如-D或者-I等配置。
    • CPPFLAGS:用于預(yù)處理相關(guān)的配置,既可以用于C編譯,同時(shí)也被用于ASM編譯。
    • _CPPDEFFLAGS:用于-D的預(yù)編譯配置。
    • _CPPINCFLAGS:用于-I的include路徑配置。
      ?
{'CC': 'gcc','CCCOM': '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES','CCFLAGS': [],'CFLAGS': [],'_CCCOMCOM': '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS','CPPDEFPREFIX': '-D','CPPDEFSUFFIX': '','_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__, ''TARGET, SOURCE)}','INCPREFIX': '-I','INCSUFFIX': '','_CPPINCFLAGS': '${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, ''TARGET, SOURCE, affect_signature=False)}', }

????????其實(shí)熟悉GCC的基本已經(jīng)看明白了,其實(shí)把gcc編譯object的參數(shù)全部配置好了,需要的話直接改env對(duì)應(yīng)的參數(shù)即可。

????????在示例中,obj = Object('main.c')中SOURCES = [main.c],TARGET = main.o,其他參數(shù)由于都沒(méi)開(kāi)啟,所以沒(méi)顯示。最終就是我們看到的gcc操作。

gcc -o main.o -c main.c obj = Object('main.c')

????????假設(shè)調(diào)整CCFLAGS,加入-g參數(shù),編譯結(jié)果如下圖所示,可以看出確實(shí)是跟著變的,之后我們只要對(duì)應(yīng)改相關(guān)的參數(shù),就可以做到修改gcc的目的。

?

ASM文件編譯行為分析

????????在PC環(huán)境下,基本很少寫(xiě)ASM相關(guān)的程序,而在嵌入式環(huán)境下,不管是startup文件還是一些特殊用途的行為,都需要使用ASM語(yǔ)句進(jìn)行操作。

????????類(lèi)似于C文件的編譯過(guò)程,由于PC環(huán)境所需的匯編指令各不相同,在嵌入式系統(tǒng)下針對(duì)對(duì)應(yīng)的芯片,也有不同匯編指令,本節(jié)只對(duì)相關(guān)配置進(jìn)行說(shuō)明。

????????從上文可知,scons是通過(guò)ASCOM來(lái)指導(dǎo)asm文件編譯的。從官網(wǎng)上也可以看出是通過(guò)這個(gè)來(lái)完成對(duì)c的源文件編譯,生成object文件。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-gKSS5iUs-1663252258508)(C:/Users/wenbo/AppData/Roaming/Typora/typora-user-images/image-20220915091107811.png)]

通過(guò)dump可知,默認(rèn)配置下,各個(gè)參數(shù)如下:

  • TARGET:就是目標(biāo)文件
  • SOURCES:就是源文件列表
  • ASFLAGS:通用ASM配置參數(shù)
{'AS': 'as','ASCOM': '$AS $ASFLAGS -o $TARGET $SOURCES','ASFLAGS': [], }

????????和gcc類(lèi)似,實(shí)際是使用as來(lái)對(duì)ASM程序進(jìn)行編譯,生成object文件。

Link編譯行為分析

????????在完成Object的文件編譯后,生成了一個(gè)或多個(gè)的Object文件。編譯的最后一步是將這些Object文件Link為Program程序。

????????我們保留生成的Object,只執(zhí)行Program,

????????首先我們調(diào)整下編譯行為,注釋Program,只執(zhí)行Object,可以看到其最終執(zhí)行了gcc -o main.exe main.o,那為什么其知道要使用這個(gè)命令呢?如果我需要加一些編譯參數(shù),應(yīng)該如何配置呢?如果要進(jìn)行嵌入式開(kāi)發(fā),需要替換gcc為aram-xx-ld如何處理?

?????????從上文可知,scons是通過(guò)LINKCOM來(lái)指導(dǎo)LINK的。從官網(wǎng)上也可以看出是通過(guò)這個(gè)來(lái)完成對(duì)Object文件Link流程的。

?

通過(guò)dump可知,默認(rèn)配置下,各個(gè)參數(shù)如下,由于LINK實(shí)際環(huán)境使用的程序各不一樣,所以實(shí)際是一個(gè)python對(duì)象:

  • TARGET:就是目標(biāo)文件
  • SOURCES:就是源文件列表
  • LINKFLAGS:通用ld配置參數(shù)
  • _LIBDIRFLAGS:用于-L的lib路徑配置,LIBPATH為具體路徑
  • _LIBFLAGS: 用于-l的lib文件配置,LIBS為具體lib名稱(chēng)。
    ?
{'LINK': '$SMARTLINK','LINKCOM': '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS ''$_LIBFLAGS','LINKFLAGS': [],'LIBDIRPREFIX': '-L','LIBDIRSUFFIX': '','_LIBDIRFLAGS': '${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, ''RDirs, TARGET, SOURCE, affect_signature=False)}','LIBLINKPREFIX': '-l','LIBLINKSUFFIX': '','_LIBFLAGS': '${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, ''LIBSUFFIXES, __env__)}', }

????????和GCC一樣,Program最終調(diào)用的就是這個(gè)配置。

????????假設(shè)調(diào)整LINKFLAGS,加入-g參數(shù),編譯結(jié)果如下圖所示,可以看出確實(shí)是跟著變的,之后我們只要對(duì)應(yīng)改相關(guān)的參數(shù),就可以做到修改link的目的。

嵌入式開(kāi)發(fā)和Scons模板

????????默認(rèn)情況下,c編譯是根據(jù)具體編譯環(huán)境來(lái)的,scons會(huì)自己選定gcc程序、asm程序和Link程序,但是在嵌入式開(kāi)發(fā)時(shí),需要指定交叉編譯器,按照之前的所描述的,其實(shí)大家已經(jīng)清楚了,只需要調(diào)整相應(yīng)的配置參數(shù)即可。

????????此外嵌入式開(kāi)發(fā)也有一些特殊的配置,這都需要我們理解并調(diào)整配置參數(shù)才行。

????????如下所示,每行都有注釋,下面對(duì)一些關(guān)鍵參數(shù)/函數(shù)進(jìn)行說(shuō)明:

  • get_path_files:工具函數(shù),獲取路徑下所有特定后綴的文件,當(dāng)然可以用其他方式實(shí)現(xiàn)(實(shí)現(xiàn)這個(gè)函數(shù)主要為了寫(xiě)path的時(shí)候方便)
  • GCC_ARM_PATH:交叉工具鏈路徑,scons直接改工作路徑不怎么會(huì),直接指定路徑
  • PLF:編譯平臺(tái),默認(rèn)使用PC編譯,當(dāng)然嵌入式開(kāi)發(fā)可以選'arm',之后會(huì)自動(dòng)去配置相關(guān)參數(shù)
  • PREFIX:嵌入式開(kāi)發(fā)需要,交叉工具鏈前綴
  • SPEC_LD_FLAGS:arm交叉工具鏈開(kāi)發(fā)的時(shí)候,LD使用有一些特殊的要求,scons原生的參數(shù)不怎么好用,需要在_LIBFLAGS參數(shù)尾巴拼接上Map信息,其他工具鏈有特殊要求也可以根據(jù)需要調(diào)整
    ?

?

import osdef get_path_files(dirs, file_ext):path_files = []# print('dir: ' + str(dirs))for dir in dirs:# print('dir: ' + dir)path_files.append(Glob(dir + '/' + file_ext))return path_filesGCC_ARM_PATH = 'D:/env/gcc-arm-none-eabi-4_8-2014q3-20140805-win32'#PLF = 'arm' PLF = ''# toolchains if PLF == 'arm':PREFIX = GCC_ARM_PATH + '/bin/arm-none-eabi-' else:PREFIX = ''CC = PREFIX + 'gcc' AS = PREFIX + 'as' AR = PREFIX + 'ar' CXX = PREFIX + 'g++' LINK = PREFIX + 'ld'SIZE = PREFIX + 'size' OBJDUMP = PREFIX + 'objdump' OBJCPY = PREFIX + 'objcopy'TARGET_PATH = 'build/' TARGET_NAME = 'main' TARGET_WITHOUT_SUFFIX = TARGET_PATH + TARGET_NAME################################################################################### # C source dirs config C_DIRS = [] #C_DIRS.append('src')# C source files config C_FILES = [] #C_FILES.append('main.c')# Create c sources list C_SRC_LIST = get_path_files(C_DIRS, '*.c') + C_FILES################################################################################### # ASM source dirs config AS_DIRS = [] #AS_DIRS.append('src')# ASM source files config AS_FILES = [] #AS_FILES.append('startup.s')AS_SRC_LIST = get_path_files(AS_DIRS, '*.s') + AS_FILES################################################################################### # -I, Include path config CPP_PATH = [] #CPP_PATH.append('inc')# -D, Preprocess Define CPP_DEFINES = [] #CPP_DEFINES.append('CFG_TEST')# C generate define C_FLAGS = [] C_FLAGS.append('-O1') C_FLAGS.append('-g') C_FLAGS.append('-std=c99')# C and C++ generate define CC_FLAGS = [] CC_FLAGS.append('-Wall')# ASM generate define AS_FLAGS = [] AS_FLAGS.append('-g')# Link Config LINK_FLAGS = [] #LINK_FLAGS.append('-Wl,–gc-sections')# lib path. LIB_PATH = [] #LIB_PATH.append('lib')# .lib, .a file LIBS_FILES = [] #LIBS_FILES.append('test')# spec ld flag. Arm spec. SPEC_LD_FLAGS = [] if PLF == 'arm':SPEC_LD_FLAGS.append('-Map')SPEC_LD_FLAGS.append(TARGET_WITHOUT_SUFFIX + '.map')SPEC_LD_FLAGS.append('-T' + 'src/map_ram.txt')env = Environment()################################################################################### # Step0: toolchains setting. if PLF == 'arm':env['CC'] = CCenv['AS'] = ASenv['AR'] = ARenv['CXX'] = CXXenv['LINK'] = LINKenv['OBJSUFFIX'] = '.o'env['LIBPREFIX'] = 'lib'env['LIBSUFFIX'] = '.a'env['PROGSUFFIX'] = '.elf'################################################################################### # Step1: C compile setting. use <print(env.Dump())> for details. # 'CCCOM': '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'# Step1.0: General options, like: optim/debug setting. $CFLAGS. env.Append(CFLAGS=C_FLAGS)# Step1.1: General options, other setting. $CCFLAGS. env.Append(CCFLAGS=CC_FLAGS)# Step1.2: -D, -I, setting. $_CCCOMCOM # '_CCCOMCOM': '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS' # StepX.2.0: CPPFLAGS setting. --- do nothing. # StepX.2.1: -D setting. # 'CPPDEFPREFIX': '-D' # '_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__, ' # 'TARGET, SOURCE)}', env.Append(CPPDEFINES=CPP_DEFINES) # Step1.2.2: -I setting. # 'INCPREFIX': '-I' # '_CPPINCFLAGS': '${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, ' # 'TARGET, SOURCE, affect_signature=False)}', env.Append(CPPPATH=CPP_PATH)################################################################################### # Step2: ASM compile setting. use <print(env.Dump())> for details. # 'ASCOM': '$AS $ASFLAGS -o $TARGET $SOURCES'# Step2.0: General options. $ASFLAGS. env.Append(ASFLAGS=AS_FLAGS)################################################################################### # Step3: LINK setting. use <print(env.Dump())> for details. # 'LINKCOM': '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS ' # '$_LIBFLAGS',# Step3.0: General options. $LINKFLAGS. env.Append(LINKFLAGS=LINK_FLAGS)# Step3.1: Link path setting. $_LIBDIRFLAGS. # '_LIBDIRFLAGS': '${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, ' # 'RDirs, TARGET, SOURCE, affect_signature=False)}', env.Append(LIBPATH=LIB_PATH)# Step3.2: libs setting, like *.a, *.lib. $_LIBFLAGS. # '_LIBFLAGS': '${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, ' # 'LIBSUFFIXES, __env__)}', env.Append(LIBS=LIBS_FILES)# Step3.3: Add some spec params. must append at end. env.Append(_LIBFLAGS=SPEC_LD_FLAGS)################################################################################### # Step4: Compile Object files, use: # 1. <$CCCOM>: For c code compile # 2. <$ASCOM>: For asm code compile c_objs = env.Object(C_SRC_LIST) as_objs = env.Object(AS_SRC_LIST)################################################################################### # Step5: Compile target <.elf>, use <$LINKCOM>. target = env.Program(target = TARGET_WITHOUT_SUFFIX, source=[c_objs, as_objs])# Other compile target. env.Command(TARGET_WITHOUT_SUFFIX + '.bin', target, OBJCPY + ' -v -O binary $SOURCE $TARGET') env.Command(TARGET_WITHOUT_SUFFIX + '.lst', target, OBJDUMP + ' --source --all-headers --demangle --line-numbers --wide $SOURCE > $TARGET') env.Command(TARGET_WITHOUT_SUFFIX + '.size', target, SIZE + ' --format=berkeley $SOURCE')# Dump() env params, if need. #print(env.Dump())

模板使用示例

????????下面舉一個(gè)例子,還是以PC舉例,嵌入式開(kāi)發(fā)自己根據(jù)需要配置即可。

????????有如下的一個(gè)多文件結(jié)構(gòu)的C代碼,目前要用scons來(lái)編譯,在根目錄下寫(xiě)SConstruct配置文件。

?????????最終的SConstruct配置如下:

import osdef get_path_files(dirs, file_ext):path_files = []# print('dir: ' + str(dirs))for dir in dirs:# print('dir: ' + dir)path_files.append(Glob(dir + '/' + file_ext))return path_filesGCC_ARM_PATH = 'D:/env/gcc-arm-none-eabi-4_8-2014q3-20140805-win32'#PLF = 'arm' PLF = ''# toolchains if PLF == 'arm':PREFIX = GCC_ARM_PATH + '/bin/arm-none-eabi-' else:PREFIX = ''CC = PREFIX + 'gcc' AS = PREFIX + 'as' AR = PREFIX + 'ar' CXX = PREFIX + 'g++' LINK = PREFIX + 'ld'SIZE = PREFIX + 'size' OBJDUMP = PREFIX + 'objdump' OBJCPY = PREFIX + 'objcopy'TARGET_PATH = 'build/' TARGET_NAME = 'main' TARGET_WITHOUT_SUFFIX = TARGET_PATH + TARGET_NAME################################################################################### # C source dirs config C_DIRS = [] C_DIRS.append('app\driver\src') C_DIRS.append('module1\src') C_DIRS.append('module2\src')# C source files config C_FILES = [] C_FILES.append('app\main.c')# Create c sources list C_SRC_LIST = get_path_files(C_DIRS, '*.c') + C_FILES################################################################################### # ASM source dirs config AS_DIRS = [] #AS_DIRS.append('src')# ASM source files config AS_FILES = [] #AS_FILES.append('startup.s')AS_SRC_LIST = get_path_files(AS_DIRS, '*.s') + AS_FILES################################################################################### # -I, Include path config CPP_PATH = [] CPP_PATH.append('app\driver\inc') CPP_PATH.append('module1\inc') CPP_PATH.append('module2\inc')# -D, Preprocess Define CPP_DEFINES = [] #CPP_DEFINES.append('CFG_TEST')# C generate define C_FLAGS = [] C_FLAGS.append('-O1') C_FLAGS.append('-g') C_FLAGS.append('-std=c99')# C and C++ generate define CC_FLAGS = [] CC_FLAGS.append('-Wall')# ASM generate define AS_FLAGS = [] AS_FLAGS.append('-g')# Link Config LINK_FLAGS = [] #LINK_FLAGS.append('-Wl,–gc-sections')# lib path. LIB_PATH = [] #LIB_PATH.append('lib')# .lib, .a file LIBS_FILES = [] #LIBS_FILES.append('test')# spec ld flag. Arm spec. SPEC_LD_FLAGS = [] if PLF == 'arm':SPEC_LD_FLAGS.append('-Map')SPEC_LD_FLAGS.append(TARGET_WITHOUT_SUFFIX + '.map')SPEC_LD_FLAGS.append('-T' + 'src/map_ram.txt')env = Environment()################################################################################### # Step0: toolchains setting. if PLF == 'arm':env['CC'] = CCenv['AS'] = ASenv['AR'] = ARenv['CXX'] = CXXenv['LINK'] = LINKenv['OBJSUFFIX'] = '.o'env['LIBPREFIX'] = 'lib'env['LIBSUFFIX'] = '.a'env['PROGSUFFIX'] = '.elf'################################################################################### # Step1: C compile setting. use <print(env.Dump())> for details. # 'CCCOM': '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'# Step1.0: General options, like: optim/debug setting. $CFLAGS. env.Append(CFLAGS=C_FLAGS)# Step1.1: General options, other setting. $CCFLAGS. env.Append(CCFLAGS=CC_FLAGS)# Step1.2: -D, -I, setting. $_CCCOMCOM # '_CCCOMCOM': '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS' # StepX.2.0: CPPFLAGS setting. --- do nothing. # StepX.2.1: -D setting. # 'CPPDEFPREFIX': '-D' # '_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__, ' # 'TARGET, SOURCE)}', env.Append(CPPDEFINES=CPP_DEFINES) # Step1.2.2: -I setting. # 'INCPREFIX': '-I' # '_CPPINCFLAGS': '${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, ' # 'TARGET, SOURCE, affect_signature=False)}', env.Append(CPPPATH=CPP_PATH)################################################################################### # Step2: ASM compile setting. use <print(env.Dump())> for details. # 'ASCOM': '$AS $ASFLAGS -o $TARGET $SOURCES'# Step2.0: General options. $ASFLAGS. env.Append(ASFLAGS=AS_FLAGS)################################################################################### # Step3: LINK setting. use <print(env.Dump())> for details. # 'LINKCOM': '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS ' # '$_LIBFLAGS',# Step3.0: General options. $LINKFLAGS. env.Append(LINKFLAGS=LINK_FLAGS)# Step3.1: Link path setting. $_LIBDIRFLAGS. # '_LIBDIRFLAGS': '${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, ' # 'RDirs, TARGET, SOURCE, affect_signature=False)}', env.Append(LIBPATH=LIB_PATH)# Step3.2: libs setting, like *.a, *.lib. $_LIBFLAGS. # '_LIBFLAGS': '${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, ' # 'LIBSUFFIXES, __env__)}', env.Append(LIBS=LIBS_FILES)# Step3.3: Add some spec params. must append at end. env.Append(_LIBFLAGS=SPEC_LD_FLAGS)################################################################################### # Step4: Compile Object files, use: # 1. <$CCCOM>: For c code compile # 2. <$ASCOM>: For asm code compile c_objs = env.Object(C_SRC_LIST) as_objs = env.Object(AS_SRC_LIST)################################################################################### # Step5: Compile target <.elf>, use <$LINKCOM>. target = env.Program(target = TARGET_WITHOUT_SUFFIX, source=[c_objs, as_objs])# Other compile target. env.Command(TARGET_WITHOUT_SUFFIX + '.bin', target, OBJCPY + ' -v -O binary $SOURCE $TARGET') env.Command(TARGET_WITHOUT_SUFFIX + '.lst', target, OBJDUMP + ' --source --all-headers --demangle --line-numbers --wide $SOURCE > $TARGET') env.Command(TARGET_WITHOUT_SUFFIX + '.size', target, SIZE + ' --format=berkeley $SOURCE')# Dump() env params, if need. #print(env.Dump())

執(zhí)行scons操作,可以看到相關(guān)參數(shù)的編譯過(guò)程,最后也會(huì)生成bin、lst以及code size信息。

D:\test\sample_4>scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o app\driver\src\driver1.1.o -c -O1 -g -std=c99 -Wall -Iapp\driver\inc -Imodule1\inc -Imodule2\inc app\driver\src\driver1.1.c gcc -o app\driver\src\driver2.2.o -c -O1 -g -std=c99 -Wall -Iapp\driver\inc -Imodule1\inc -Imodule2\inc app\driver\src\driver2.2.c gcc -o app\main.o -c -O1 -g -std=c99 -Wall -Iapp\driver\inc -Imodule1\inc -Imodule2\inc app\main.c gcc -o module1\src\module1.1.o -c -O1 -g -std=c99 -Wall -Iapp\driver\inc -Imodule1\inc -Imodule2\inc module1\src\module1.1.c gcc -o module1\src\module1.2.o -c -O1 -g -std=c99 -Wall -Iapp\driver\inc -Imodule1\inc -Imodule2\inc module1\src\module1.2.c gcc -o module2\src\module2.1.o -c -O1 -g -std=c99 -Wall -Iapp\driver\inc -Imodule1\inc -Imodule2\inc module2\src\module2.1.c gcc -o module2\src\module2.2.o -c -O1 -g -std=c99 -Wall -Iapp\driver\inc -Imodule1\inc -Imodule2\inc module2\src\module2.2.c gcc -o build\main.exe app\driver\src\driver1.1.o app\driver\src\driver2.2.o module1\src\module1.1.o module1\src\module1.2.o module2\src\module2.1.o module2\src\module2.2.o app\main.o objcopy -v -O binary build\main.exe build\main.bin copy from `build\main.exe' [pei-i386] to `build\main.bin' [binary] objdump --source --all-headers --demangle --line-numbers --wide build\main.exe > build\main.lst size --format=berkeley build\main.exetext data bss dec hex filename39620 2944 2676 45240 b0b8 build\main.exe scons: done building targets.D:\test\sample_4>scons -c scons: Reading SConscript files ... scons: done reading SConscript files. scons: Cleaning targets ... Removed app\driver\src\driver1.1.o Removed app\driver\src\driver2.2.o Removed app\main.o Removed module1\src\module1.1.o Removed module1\src\module1.2.o Removed module2\src\module2.1.o Removed module2\src\module2.2.o Removed build\main.exe Removed build\main.bin Removed build\main.lst scons: done cleaning targets.

轉(zhuǎn)自:Scons環(huán)境搭建和編譯原理概述及嵌入式開(kāi)發(fā)常用模板_CoderBob的博客-CSDN博客_scons源碼解析

總結(jié)

以上是生活随笔為你收集整理的Scons环境搭建和编译原理概述及嵌入式开发常用模板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

国产福利在线免费 | 人人爽人人香蕉 | 91精品麻豆 | 成x99人av在线www | 中文字幕 在线 一 二 | 久久超级碰 | a在线播放 | 日韩在线免费高清视频 | 国内精品中文字幕 | 久久免费视频在线观看30 | 亚洲综合视频网 | 91看片成人 | 91热爆在线观看 | 日日操操 | 九月婷婷人人澡人人添人人爽 | 国产高清视频色在线www | 天堂av在线网站 | 69精品久久久 | 中文字幕亚洲高清 | av免费看av | 狠狠伊人 | 欧美日韩国产页 | 成人午夜黄色 | 亚洲区视频在线 | 日韩激情视频在线观看 | 久久99热这里只有精品 | 日本精品中文字幕在线观看 | 五月天电影免费在线观看一区 | 五月天综合激情网 | 国内三级在线观看 | 国产中的精品av小宝探花 | 亚洲91精品在线观看 | 日韩av中文字幕在线免费观看 | 婷婷在线视频观看 | 国产日韩在线观看一区 | 九九九九九九精品 | 国产一级高清 | 亚洲黄色成人 | 色综合中文字幕 | 一级片免费在线 | 日本aaaa级毛片在线看 | 日韩精品免费在线视频 | 四虎影视成人精品 | 久久久久免费看 | 在线观看免费黄视频 | 国产人成精品一区二区三 | 中文字幕在线免费播放 | 日本黄色免费看 | 婷婷丁香在线视频 | 亚洲.www| 国产在线污 | 久久久久免费 | 久久久久久久久久免费 | 国产一线二线三线在线观看 | 国产精品理论在线观看 | 日韩一区二区三区在线看 | 午夜免费福利片 | 黄色的网站在线 | 中文欧美字幕免费 | 亚洲成人午夜在线 | 欧美精品免费在线 | 亚洲精品视频在线观看免费 | 一区二区伦理电影 | 99久热在线精品视频观看 | 成人精品亚洲 | 91在线入口| 97在线精品视频 | 少妇高潮流白浆在线观看 | 久久久免费看视频 | 日日夜夜人人精品 | 亚洲爱爱视频 | 精品国产成人在线影院 | 免费黄在线看 | 国产精品久久婷婷六月丁香 | 天天在线免费视频 | 久久久精品小视频 | 欧美另类交人妖 | 91精品在线播放 | 中文字幕视频网站 | 国产精品一区二区中文字幕 | 国产99在线| 亚洲自拍av在线 | 日韩专区视频 | 国产剧情一区二区在线观看 | 亚洲乱码中文字幕综合 | 综合色站 | 婷婷狠狠操 | www黄com| 国产一区在线视频观看 | 免费日韩 精品中文字幕视频在线 | 国产高清久久久久 | 久久九九网站 | 99se视频在线观看 | 黄色特级一级片 | 日韩网站在线免费观看 | 99久久精品久久久久久动态片 | 亚洲人人射 | 天天翘av| 综合国产在线 | 波多野结衣一区三区 | 久久精品国产精品亚洲 | 免费一级毛毛片 | 亚洲综合婷婷 | 国产97av| 欧美一级片在线免费观看 | 在线看av的网址 | 国产成人精品电影久久久 | 成人日批视频 | 久久福利 | 欧美日韩一级久久久久久免费看 | 丁香色婷婷 | 韩国在线视频一区 | 国产精品久久久久一区二区三区共 | 免费黄色在线播放 | 日韩啪视频 | 久久久久女人精品毛片 | 免费网站在线 | 久久精品欧美一区二区三区麻豆 | 在线观看国产一区二区 | 亚洲免费色 | 国产精品正在播放 | 国产成人精品日本亚洲999 | 激情深爱五月 | 免费久久99精品国产 | 久草在线免费电影 | 亚洲欧美精品一区 | 久久久久国产精品一区二区 | 色在线最新 | 国产麻豆视频 | 亚洲永久精品一区 | 深爱五月网| 日韩在线观看一区二区 | 欧美日韩免费看 | 久久艹综合 | 日韩色一区二区三区 | 色av色av色av| 丁香在线观看完整电影视频 | 中文字幕高清免费日韩视频在线 | 精品久久久久久久久中文字幕 | 狠狠干.com | 福利视频一区二区 | 欧美性色综合网 | 18国产精品白浆在线观看免费 | 在线视频国产区 | 女人高潮特级毛片 | 日韩av成人在线观看 | 四季av综合网站 | 中文综合在线 | 国产一级片在线播放 | 欧美aaa级片 | 中文字幕在线视频一区二区三区 | 在线观看日韩一区 | 亚洲激情精品 | 国产精品影音先锋 | 久久综合五月天 | 日本久久久久久 | 国产午夜精品久久久久久久久久 | 中文字幕一区二区三区乱码在线 | 久草在| 99免在线观看免费视频高清 | 一区二区 精品 | 偷拍精偷拍精品欧洲亚洲网站 | 成人免费视频视频在线观看 免费 | 麻豆系列在线观看 | 色五月成人 | 免费看黄20分钟 | 中文字幕在线影院 | 久草在线资源网 | 又爽又黄又无遮挡网站动态图 | 日韩免费一级电影 | 九九九视频在线 | 黄色avwww | www操操操 | 国产黄色精品在线观看 | 亚州激情视频 | 欧美日韩国产二区三区 | 欧美专区国产专区 | 日韩啪啪小视频 | 亚洲最快最全在线视频 | 91黄视频在线 | 亚洲特级毛片 | 亚洲精品欧美专区 | 午夜视频福利 | 丝袜足交在线 | 日本一区二区免费在线观看 | 久久五月激情 | 日本中文字幕电影在线免费观看 | 超碰97国产| 免费高清无人区完整版 | 蜜臀久久99精品久久久无需会员 | 国产精品爽爽久久久久久蜜臀 | 精品国产一区二区三区噜噜噜 | 国产午夜三级一二三区 | 免费a视频在线观看 | 一级淫片a| 日韩三级中文字幕 | a级国产毛片| 久久午夜免费观看 | 在线欧美国产 | 97超碰资源| 91香蕉视频720p | 欧美激情精品久久久久久变态 | 亚洲一二区精品 | 精品国产a | 国产成人亚洲在线电影 | 亚洲黄色影院 | www久久国产 | 成年人三级网站 | 成人黄色电影在线 | 免费污片 | 我爱av激情网 | www.xxxx变态.com | 国产精品区在线观看 | 日韩精品一区二区在线 | 亚洲黄色av一区 | av亚洲产国偷v产偷v自拍小说 | 西西444www大胆无视频 | 免费人人干 | 久草91视频 | avav99| 国产中文视频 | 亚洲精品久久久久999中文字幕 | 黄色精品国产 | 久久久久成人精品免费播放动漫 | 成人日韩av | 天天看天天操 | 国产精品国产亚洲精品看不卡15 | 亚洲精品www久久久久久 | 亚洲年轻女教师毛茸茸 | 国产精品免费观看国产网曝瓜 | 欧美日韩视频精品 | 91网址在线| 午夜精品久久久久久久99无限制 | 亚洲视频一级 | 91精品在线观看视频 | 国产在线播放一区二区三区 | 黄毛片在线观看 | 丁香花在线观看免费完整版视频 | 国产激情小视频在线观看 | 精品国产美女 | 欧美中文字幕久久 | 激情久久五月 | 麻豆久久久久久久 | 欧美大片aaa| 欧美aa级| 五月婷婷激情五月 | 天天人人综合 | 国产五码一区 | 亚洲精选国产 | 欧美xxxxx在线视频 | 玖玖在线免费视频 | 蜜臀av在线一区二区三区 | 日本午夜在线亚洲.国产 | 开心激情五月婷婷 | 久久久久夜色 | 国产99久久| 欧美成人在线免费观看 | 9在线观看免费高清完整版在线观看明 | 国产区高清在线 | 欧美人牲 | 四虎国产精品免费观看视频优播 | 深爱激情久久 | 日本在线观看视频一区 | 在线小视频你懂得 | 亚洲天堂网视频在线观看 | 黄网站免费看 | 久久99国产一区二区三区 | 日韩特黄一级欧美毛片特黄 | 日日夜夜艹 | 日韩免费三级 | 天天天天射 | 国产精品不卡在线 | 97国产小视频 | 国产精品视频免费观看 | 亚洲黄色一级大片 | 日韩精品视频免费 | 在线观看黄色国产 | 97视频免费看 | 伊人色**天天综合婷婷 | 久久久网址 | 国产成人av一区二区三区在线观看 | 国产不卡视频在线 | av丁香 | 色婷婷福利视频 | 在线观看国产一区二区 | 亚洲国内精品视频 | 黄av免费在线观看 | 精品99在线 | 亚洲成a人片在线www | 亚洲高清久久久 | 久久精品视频免费 | 成人av影视在线 | 久久久国产精品一区二区三区 | 国产91精品高清一区二区三区 | 综合伊人久久 | 婷婷综合导航 | 成人在线超碰 | 久久免费在线观看视频 | 99久久精品国 | a久久久久久 | 亚洲播播 | 美女很黄免费网站 | 97天堂 | 91人人揉日日捏人人看 | 日韩精品中文字幕在线不卡尤物 | 午夜影视一区 | 成人av高清在线观看 | 亚洲福利精品 | 精品国产乱码久久久久久久 | 九九涩涩av台湾日本热热 | 亚洲资源在线观看 | 五月婷婷久 | 美女网站在线观看 | 国产精品久久一区二区三区, | 久草在线看片 | 欧美日韩久| 中文字幕免费看 | 精品亚洲在线 | 婷婷色综合网 | 亚洲狠狠婷婷 | 免费精品在线视频 | 免费a级毛片在线看 | 99精品视频在线免费观看 | 国产精品一区二区美女视频免费看 | 激情六月婷婷久久 | 日本h在线播放 | 操操操人人| 久久久久久久久黄色 | 99精品黄色片免费大全 | 久久久免费看片 | av网站免费线看精品 | 国产成人精品aaa | 精品一二三区视频 | 粉嫩av一区二区三区入口 | 国产亚洲观看 | 欧美一区二区三区特黄 | 免费精品视频在线观看 | 在线视频福利 | 99精品色| 亚洲韩国一区二区三区 | 中文字幕色婷婷在线视频 | www.97视频| 国产69熟| 看黄色91 | 狠狠躁日日躁狂躁夜夜躁av | 亚洲精品视频在线观看免费视频 | 国产在线精品一区二区三区 | 五月天婷婷在线视频 | 欧美性做爰猛烈叫床潮 | 欧美一区二区三区在线观看 | 深夜免费福利网站 | 天海冀一区二区三区 | 亚洲精品在线视频网站 | 97色在线视频 | 亚洲欧洲中文日韩久久av乱码 | 五月婷婷视频 | 高清一区二区 | 在线视频你懂 | 久久国语露脸国产精品电影 | 亚洲精品大片www | 天天射成人 | 一级黄色a视频 | 亚洲欧美综合精品久久成人 | 美女久久99| 狠狠色狠狠色 | 日日干美女 | 日韩网站在线观看 | 97精品国产手机 | 国产精品久久久久免费 | 久久久久久美女 | 久久99影院| 91九色蝌蚪视频网站 | 久久国产精品一区二区三区四区 | 91麻豆高清视频 | 人人狠狠综合久久亚洲婷 | 97在线观看免费视频 | 亚洲国产欧美在线人成大黄瓜 | 99国产高清| 国产免费观看av | 黄色成人小视频 | 国产视频在线观看一区二区 | 在线观看一区二区视频 | 亚洲精品av在线 | 久久九九视频 | 日韩中文字幕在线观看 | 99精品久久精品一区二区 | 日本mv大片欧洲mv大片 | 免费看国产精品 | 麻豆91在线播放 | 亚洲精品美女在线观看 | 国产99中文字幕 | 91精品国产欧美一区二区成人 | 色一级片 | 正在播放国产一区 | 久久精久久精 | 欧美视频xxx| 中文成人字幕 | 久久久久一区二区三区 | 激情视频区| 人人插人人草 | 亚洲精品国精品久久99热 | 国产在线更新 | 亚洲成人网av| 丝袜美女视频网站 | 久久高清国产 | 午夜丰满寂寞少妇精品 | 欧美国产日韩一区二区三区 | 中文字幕乱码在线播放 | 国产视频久 | 伊人久久电影网 | 天天干天天干天天干天天干天天干天天干 | av 一区 二区 久久 | 久久国产电影院 | 精品在线视频一区二区三区 | 亚洲麻豆精品 | 日韩精品一区二区在线 | 亚洲成aⅴ人在线观看 | 中文国产在线观看 | 国产免费观看av | 国内精品久久久久久久久久久 | 在线观看黄色免费视频 | 国内精品久久久久久中文字幕 | 国产精美视频 | 中文字幕 第二区 | 亚洲第一色 | 久久精品牌麻豆国产大山 | 日韩精品中文字幕有码 | 伊人手机在线 | 中文综合在线 | 亚洲第一中文网 | 亚洲涩涩网 | 91视频在线网址 | 国精产品999国精产 久久久久 | 久久精品4| 久久精品3| 亚洲最新av在线网址 | 天天鲁一鲁摸一摸爽一爽 | 国产精品日韩 | 国产精品不卡 | 亚洲春色综合另类校园电影 | 日韩试看 | 精品国产资源 | 午夜精品福利一区二区三区蜜桃 | 精品久久久久久久久久岛国gif | 日韩久久精品一区二区三区 | 美女免费视频一区二区 | 国产精品99久久久精品免费观看 | 婷婷久久综合九色综合 | 色天堂在线视频 | 国产精品久久伊人 | 日韩精品在线观看av | 99久久精品国产一区 | 国产精品s色 | 国产在线传媒 | 欧美va天堂va视频va在线 | 免费高清在线视频一区· | 日韩欧美一区视频 | 国产群p | 婷婷五月色综合 | 91视频免费观看 | 99久久久久久久久久 | 日韩成人免费在线观看 | 成人日韩av| 国产亚洲成av人片在线观看桃 | 婷婷色网站 | 国产精品久久久久久久久久久久午夜 | 在线激情小视频 | 九九视频免费观看视频精品 | 四虎成人精品永久免费av九九 | 99久久久国产精品美女 | 天天草天天| 国产成人精品一区二区三区在线 | 国产91精品一区二区麻豆网站 | 日韩一区二区三区不卡 | 欧美国产日韩一区二区 | 精品一区二区久久久久久久网站 | 精品国产99| 国产精品久久嫩一区二区免费 | 久久99精品波多结衣一区 | 亚洲理论片在线观看 | 国产一区视频在线播放 | 中文字幕日韩一区二区三区不卡 | 天天干,夜夜操 | 91在线视频| 天天操夜夜操夜夜操 | 9幺看片 | 国产一区在线视频观看 | 欧美aa在线 | 国产成人一二片 | 在线视频 国产 日韩 | 久久精品久久综合 | 永久免费精品视频网站 | 亚洲第一区在线观看 | 日韩精品中文字幕有码 | 国产最新视频在线观看 | 一区二区三区观看 | 天天色天天干天天 | 96国产精品视频 | 69av免费视频 | 一区二区三区日韩在线观看 | 精品一区二区三区四区在线 | 中文字幕日韩高清 | 欧美韩日在线 | 久久久人人爽 | 国产片免费在线观看视频 | 西西444www大胆无视频 | 四虎国产视频 | 国产97视频 | 日韩精品国产一区 | 日韩欧美一区二区在线播放 | 国产一区二区在线观看视频 | 日韩中文字幕免费看 | 色综合久久88色综合天天6 | 国产极品尤物在线 | 久久在线播放 | 国产专区免费 | 午夜精品视频一区二区三区在线看 | 欧美有色 | 日韩av男人的天堂 | 久久麻豆精品 | 免费看黄的视频 | 天天碰天天操视频 | 蜜臀av夜夜澡人人爽人人 | 99久久精品日本一区二区免费 | 在线观看欧美成人 | 91看片淫黄大片一级在线观看 | 在线观看中文字幕一区二区 | 精品中文字幕视频 | 日韩欧美国产免费播放 | 黄色精品一区 | 在线日韩av | 日韩欧美电影在线 | 欧美精品v国产精品v日韩精品 | 日本一区二区不卡高清 | 天天射天天操天天色 | 国产亚洲成av片在线观看 | 天天色天天干天天色 | 91色一区二区三区 | 一区二区三区四区五区在线 | 精品一区二区免费视频 | 久久永久免费视频 | 欧美性黄网官网 | 国产在线色站 | 日韩午夜大片 | 一区二区三区韩国免费中文网站 | 亚洲精品欧美专区 | 精品99在线观看 | 狠狠干狠狠久久 | 国产精品初高中精品久久 | 久久最新视频 | 黄污视频网站大全 | 久精品在线观看 | 91av手机在线 | 亚洲精品免费在线观看 | 三级av免费看 | 免费亚洲黄色 | 日韩精品一区二区三区不卡 | 国产一区播放 | 麻豆激情电影 | 国产高清在线免费视频 | 视频二区在线 | 激情五月网站 | 欧美日韩一级视频 | 日本中文字幕观看 | 精品欧美乱码久久久久久 | 中文字幕在线视频网站 | 日韩特级黄色片 | 高清不卡一区二区在线 | 天天操天天干天天操天天干 | 中文一区在线观看 | 婷婷日 | 最近中文字幕视频网 | 久久久久一区 | 欧洲性视频 | 手机成人免费视频 | 一区二区三区高清在线观看 | 最新不卡av | 欧美日韩精品在线观看视频 | 国产永久免费 | 日日夜夜天天久久 | 国产日韩在线播放 | 99自拍视频在线观看 | 99精品网站 | 亚洲精品视频第一页 | 精品久久久久一区二区国产 | 人人干狠狠干 | 曰韩在线| 中文字幕高清av | 五月天天天操 | 成人动漫精品一区二区 | 久久成人免费 | 91高清完整版在线观看 | 亚洲爱视频 | 91亚洲欧美激情 | 97超碰人人 | 国产人成一区二区三区影院 | 91网站免费观看 | 麻豆免费在线视频 | 日韩av片免费在线观看 | 人人爽人人爽人人爽人人爽 | 999精品网 | 国产一区二区三区午夜 | 欧美日韩国语 | 国产中文字幕精品 | 国产一线天在线观看 | 黄色av一级 | 日韩理论在线观看 | 一区二区三区免费网站 | 久久色在线播放 | 久久天堂精品视频 | av黄在线播放 | 久久电影中文字幕视频 | 色婷婷亚洲精品 | 国产视频一区二区在线播放 | 国产精品一区二区视频 | 亚洲天堂网在线观看视频 | 国产 av 日韩| 色综合天天色综合 | 成人影视免费 | 国产一级免费观看视频 | 亚洲一区二区三区四区精品 | 亚洲开心激情 | 中文字幕文字幕一区二区 | 黄色一级在线观看 | 久久免费看毛片 | 伊人伊成久久人综合网小说 | 亚洲人xxx| 中文字幕在线高清 | 人人干天天射 | 国产精品一区二区三区在线免费观看 | 日韩欧美大片免费观看 | 2021国产在线 | 国产高清一 | 久久99视频免费 | 欧美日韩中文字幕在线视频 | 中文一区二区三区在线观看 | 日韩久久精品一区二区三区下载 | 成年人黄色免费网站 | 一区二区亚洲精品 | 久久精品国产亚洲aⅴ | 一区二精品 | 精品国产a | 欧美激情在线网站 | www.91国产 | 日韩高清国产精品 | 国产黄色网 | 中文字幕刺激在线 | 日韩免费网站 | 日本精品在线看 | 欧美一级性视频 | 美女视频一区 | 欧美日韩国产一二三区 | 欧美另类xxx | a午夜电影 | 成年一级片 | 成人免费在线播放 | 中文字幕a∨在线乱码免费看 | 不卡的av片 | 久久国产精品99久久久久久老狼 | 99精品在线观看视频 | 成人蜜桃视频 | 国产爽视频| 91黄视频在线观看 | 日韩三级成人 | 精品久久久久久亚洲综合网 | 男女精品久久 | 亚洲天堂网在线观看视频 | 欧美久久久久 | 精品成人a区在线观看 | 爱射综合 | 狠狠色综合欧美激情 | 久久亚洲美女 | 狠狠干成人 | 男女免费视频观看 | 久久高清国产 | 国产中文字幕网 | 国产 在线观看 | 天天操天天射天天 | 免费在线观看一级片 | 久久免费国产电影 | 黄色大片免费播放 | 久久久久久久久久毛片 | 成人av网站在线播放 | 片网站 | 亚洲精品视频网站在线观看 | 激情五月婷婷丁香 | 久久精品亚洲国产 | 欧美va天堂在线电影 | 国产成人精品久久久久 | 亚洲国产成人精品在线观看 | www.夜夜夜 | 在线免费黄色毛片 | 久久女教师 | 亚洲久草在线 | 天天亚洲综合 | 久久久久久久久久久久99 | 免费进去里的视频 | 在线精品视频免费播放 | 在线观看亚洲免费视频 | 国产中文字幕一区二区 | 欧美在线视频一区二区三区 | 国产视频18| 丁香视频在线观看 | 久久久久免费精品视频 | 六月色| 在线观看91视频 | 日韩电影在线观看中文字幕 | 99视频精品全部免费 在线 | 久久成人综合视频 | 天天操天天操天天操天天操天天操天天操 | 午夜10000| 免费h精品视频在线播放 | 天天操天天干天天综合网 | 狠狠色伊人亚洲综合网站野外 | 日韩精品一区二区久久 | 午夜av网站| 在线国产能看的 | 久久精品网址 | 久久电影国产免费久久电影 | 欧美性生活免费看 | 91资源在线免费观看 | av不卡免费在线观看 | 日韩视频一区二区在线观看 | 国产福利免费在线观看 | 日韩激情三级 | av网站大全免费 | av一区二区三区在线观看 | 日韩av一区二区三区在线观看 | 国产美女免费视频 | 91精品国产高清自在线观看 | 天天操月月操 | 97精品国产一二三产区 | 综合久久网 | 91伊人久久大香线蕉蜜芽人口 | 日韩欧美精品一区 | 精品一区二区三区久久 | 超碰人人干人人 | 国产精品理论片在线观看 | 免费视频久久久 | 麻豆精品视频在线观看免费 | 色噜噜在线观看 | 国内精自线一二区永久 | 韩国av一区二区三区 | 91精品国产91久久久久 | 新版资源中文在线观看 | 久精品在线观看 | 国产精品门事件 | 久久久久久久综合色一本 | 国产系列 在线观看 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 日韩欧美国产激情在线播放 | 999视频网站 | 精品国产乱码久久久久久浪潮 | 欧美性网站| 国产特黄色片 | 在线观看中文字幕一区 | 婷婷久久综合网 | 免费成人黄色av | 色亚洲激情 | 久久精品99国产精品 | 天天翘av | 成人免费中文字幕 | 免费看一级特黄a大片 | 天天插天天色 | 久久字幕精品一区 | 久热这里有精品 | 成人黄视频 | 亚洲九九爱 | 日韩三级视频 | 精品国产网址 | 人人揉人人揉人人揉人人揉97 | 91丨九色丨国产在线观看 | 婷婷在线观看视频 | 一级黄色大片 | 成人精品久久 | 美女网站在线观看 | 久久高清国产视频 | 91资源在线免费观看 | 国产尤物一区二区三区 | 蜜臀久久99精品久久久无需会员 | 91在线麻豆 | 中文字幕在线有码 | 中文av在线天堂 | 国产精品久久久久久久久婷婷 | 日韩成人黄色av | 91视频午夜 | 日韩在线免费播放 | 亚洲1级片| 91在线观看视频网站 | 亚洲区二区 | 天天天天爽 | 国产精品完整版 | 国产成人av片 | 黄色一级大片免费看 | 在线看v片成人 | 日本中文字幕系列 | 波多野结衣电影一区二区 | 日本精品一区二区在线观看 | 免费日韩一区二区三区 | 中文字幕在线看视频国产中文版 | 国产精品不卡在线播放 | 免费一级特黄毛大片 | 麻豆91在线 | 免费特级黄色片 | 欧美特一级 | 国产精品大片免费观看 | 97碰在线 | 久久精品视频网 | 精品女同一区二区三区在线观看 | 国产中文字幕一区二区三区 | 久草免费在线视频观看 | 久久久久夜色 | 久久伊人精品天天 | 91久草视频 | 色婷婷av在线 | 91看片淫黄大片在线播放 | 激情av一区二区 | 国产黄色免费在线观看 | 成年人看片 | 亚洲少妇久久 | 精品久久精品 | 日韩理论电影网 | 久久精品久久精品久久精品 | 久热电影 | 午夜91视频 | 97超碰精品| 久久免费精品 | 国内精品久久久久影院一蜜桃 | 亚洲成人二区 | 国产一区在线观看视频 | 免费在线观看不卡av | 国产精品系列在线 | 日本一区二区三区免费看 | 免费网站在线 | 在线 国产 日韩 | 日本一区二区不卡高清 | www.天天成人国产电影 | 婷婷丁香av | 午夜av一区 | 狠狠躁日日躁狂躁夜夜躁av | 在线 视频 亚洲 | 国产明星视频三级a三级点| 国产精品正在播放 | 亚洲欧美日韩精品久久奇米一区 | 亚洲精品xxx | 欧美精品在线一区二区 | 国产精品第一页在线观看 | 日韩天堂网 | 日韩欧美久久 | 欧美性护士 | 婷婷亚洲激情 | 久草线 | 91麻豆产精品久久久久久 | 综合在线色 | 久久精品综合一区 | 在线看成人av | 在线播放精品一区二区三区 | 日本在线观看中文字幕无线观看 | 日韩av不卡在线 | 午夜精品一区二区三区在线播放 | 91麻豆精品国产91久久久久久 | 免费在线日韩 | 欧美性色网站 | 日日干天天爽 | 五月天丁香综合 | 精品免费在线视频 | 日韩伦理片一区二区三区 | 久久久久看片 | av中文电影| 啪一啪在线 | 超碰国产在线 | 国产精品一级视频 | 国产一区二区不卡视频 | 天天综合网入口 | 欧美久久电影 | 亚洲视频网站在线观看 | 国产免费国产 | h视频在线看 | 欧美午夜久久 | 午夜狠狠操 | 日韩高清免费电影 | 久久亚洲影院 | 三级a视频 | 激情视频免费在线观看 | 在线久草视频 | 在线视频99 | 久久这里精品视频 | 欧美激情综合五月 | 麻豆网站免费观看 | 久久美女视频 | www久久国产 | 精品视频免费看 | 成人av免费在线播放 | 狠狠躁日日躁夜夜躁av | 最近在线中文字幕 | 国产精品黄 | 亚洲欧美一区二区三区孕妇写真 | 亚洲粉嫩av | 免费毛片一区二区三区久久久 | 日本在线视频网址 | 激情深爱 | 国产精品久久久久久久久久久久久 | 久久精品精品电影网 | 久久精品99久久 | 日本激情中文字幕 | 欧美极品裸体 | 日本午夜免费福利视频 | 国产视频一区在线免费观看 | 国产精品网红福利 | 成人免费网站视频 | 亚洲午夜av | 午夜精品久久久久久久99热影院 | 日韩精品视频免费看 | 色婷婷激情电影 | 五月激情五月激情 | 久久无码精品一区二区三区 | 国产日韩欧美中文 | 伊人久久电影网 | 欧美精品久久久久久久久老牛影院 | 99精品国产在热久久 | 亚洲国产精品久久 | 韩国在线视频一区 | aaa日本高清在线播放免费观看 | 国产亚洲精品久久久久久大师 | 久久精品波多野结衣 | 亚洲黄色av网址 | 中文字幕第一 | 国产午夜av | 免费色视频网址 | av高清在线 | 亚洲黄色在线免费观看 | 91福利社区在线观看 | 韩国精品在线 | 欧美激情精品久久久久久免费印度 | 在线观看黄网 | 一区在线观看 | 男女激情免费网站 | 国产一级片毛片 | 久插视频 | 国产 日韩 欧美 在线 | 午夜精品久久久久久 | 九色在线| 日韩伦理片一区二区三区 | 91在线超碰| 97超视频 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 91精品久久久久久久久久久久久 | 精品一区精品二区 | 亚洲永久av | 成人av资源网站 | 国产资源av | 国产一级视频在线免费观看 | 日韩毛片在线一区二区毛片 | 亚洲在线国产 | 美女视频黄色免费 | 中文字幕在线国产 | 伊在线视频| a级成人毛片 | 久久精品视频免费播放 | 成人免费观看视频大全 | 婷婷激情影院 | 精品亚洲视频在线观看 | 欧美日韩一区二区三区在线免费观看 | 美女免费黄视频网站 | 超碰在线色 | 日韩精品中文字幕av | 婷婷久月 | 在线av资源 | 成人黄色免费在线观看 | 日韩视频一二三区 | 久久综合婷婷国产二区高清 | 一二三区在线 | 欧美日韩a视频 | 久久免费视频1 | 狠狠地操| 成人wwwxxx视频 | 国产色啪 | 亚洲精品99久久久久久 | 四虎在线免费观看 | av观看久久久 | 久久99视频免费 | 五月婷婷综合网 | 开心综合网 | 免费福利视频导航 | 久久久高清免费视频 | 亚洲精品乱码久久久久久按摩 | 日韩网站在线观看 | 日批网站免费观看 | 深爱五月激情网 | 亚洲一区视频免费观看 | x99av成人免费| 久久久一本精品99久久精品 | 91传媒在线 | 久久国产精品久久精品国产演员表 | 99se视频在线观看 | 一级成人免费视频 | 五月天最新网址 | 天天色.com |