免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

C/C++跨平臺開發(fā):macOS/Windows/MinGW下編譯libiconv靜態(tài)庫完整指南

C/C++跨平臺開發(fā):macOS/Windows/MinGW下編譯libiconv靜態(tài)庫完整指南 做跨平臺C/C開發(fā)的人遲早都會遇到字符編碼轉(zhuǎn)換這個繞不過去的坎。尤其是要把一套代碼同時跑在macOS、Windows和Linux上且還要求產(chǎn)物能干干凈凈地單獨(dú)部署的時候編譯一個libiconv的靜態(tài)庫就成了最省心的方案。這篇文章就圍繞“在macOS、Windows以及Windows下的MinGW環(huán)境中分別編譯libiconv靜態(tài)庫”這件事把我在實(shí)際項(xiàng)目里踩過的坑、試過的參數(shù)、驗(yàn)證過的產(chǎn)物整理出來。不管你是要給某個跨平臺數(shù)據(jù)處理工具準(zhǔn)備底層庫還是只想擺脫Windows上缺乏原生iconv的窘境這篇都能給你一條可以直接照著走的路徑。先說清楚我要做什么libiconv是GNU提供的字符編碼轉(zhuǎn)換庫接口簡單核心就是iconv_open、iconv、iconv_close這一組函數(shù)。Windows下沒有官方的iconv實(shí)現(xiàn)MSVC環(huán)境通常用第三方移植版或者干脆自己封裝而macOS系統(tǒng)自帶的iconv實(shí)際上是libiconv的舊版本但頭文件和鏈接庫的位置不算特別規(guī)矩如果你要帶一套固定版本的庫隨程序發(fā)布或者要交叉編譯給某個嵌入式目標(biāo)自己動手編譯靜態(tài)庫幾乎是必須的。MinGW則是Windows上另一條常用路線用GCC工具鏈編譯出原生Windows程序這時候libiconv的靜態(tài)版本同樣能幫我們避免一堆DLL加載問題。整個文章的核心思路是這樣的不繞彎子三種場景分開講每個場景都給出完整命令、關(guān)鍵參數(shù)的含義、以及我實(shí)測過能用的產(chǎn)物驗(yàn)證方法。中間還會穿插我在某跨平臺項(xiàng)目中遇到的實(shí)際報錯和排查過程這部分內(nèi)容普通文檔里不會寫但往往才是真正卡人的地方。1. 為什么非要用libiconv靜態(tài)庫1.1 Windows和macOS上的iconv到底有什么坑先說Windows。很多人第一反應(yīng)是Windows不是有MultiByteToWideChar和WideCharToMultiByte嗎確實(shí)有但那兩個API只能解決ANSI/UTF-16/UTF-8之間有限幾種轉(zhuǎn)換遇到GBK、BIG5、Shift-JIS這種歷史遺留編碼再遇到編碼之間互相轉(zhuǎn)換比如GBK直接轉(zhuǎn)Shift-JISWindows原生API幾乎沒有可用途徑。更麻煩的是Windows上不同版本的UCRT、MSVCRT對代碼頁的處理還有差異同樣的代碼在Win10上跑得好好的換到Win7又變了一副面孔。這就是為什么跨平臺項(xiàng)目幾乎清一色選擇libiconv它把編碼轉(zhuǎn)換統(tǒng)一成一個抽象層一份代碼在所有平臺行為一致。再說macOS。macOS確實(shí)自帶iconviconv.h在系統(tǒng)SDK里也能找到直接#include iconv.h然后鏈接-liconv似乎就行了。但這里有個隱蔽的問題macOS自帶的iconv版本更新節(jié)奏非常慢且Apple對它的自定義改動不少具體行為未必和GNU libiconv完全一致。比如某些邊緣編碼的轉(zhuǎn)換差異、錯誤處理方式、線程安全問題踩到了就很頭疼。如果項(xiàng)目里需要確保所有平臺使用同一個iconv實(shí)現(xiàn)版本而不是“隨系統(tǒng)心情”那就必須自己編一份靜態(tài)鏈接進(jìn)程序。1.2 靜態(tài)庫相比動態(tài)庫在這件事上贏在哪既然要自己編為什么不編動態(tài)庫非要用靜態(tài)庫最直接的理由是部署。Windows上動態(tài)庫意味著要帶一個iconv.dll在exe旁邊再加上依賴鏈上的libcharset.dll弄丟一個整個程序就起不來。macOS上動態(tài)庫雖然可以用install_name_tool調(diào)整加載路徑但帶上rpath的處理簽名、公證的時候也會多一些麻煩。而靜態(tài)庫只需要在鏈接階段把.a或.lib文件吃進(jìn)去最終產(chǎn)物就是一個獨(dú)立的可執(zhí)行文件復(fù)制到任何同架構(gòu)的機(jī)器上都能直接運(yùn)行不需要關(guān)心目標(biāo)機(jī)器上有沒有對應(yīng)的動態(tài)庫、版本夠不夠新。其次靜態(tài)鏈接能讓最終程序的行為更可控。動態(tài)庫的版本由運(yùn)行環(huán)境決定今天編譯時用的符號在這個版本上存在用戶機(jī)器上的老版本庫可能根本沒有這個符號或者行為完全不同。而靜態(tài)庫把實(shí)現(xiàn)完整鎖進(jìn)產(chǎn)物里源代碼是什么版本運(yùn)行就是什么版本。對講究可復(fù)現(xiàn)、需要長期維護(hù)的項(xiàng)目來說這個優(yōu)勢非常關(guān)鍵。這里補(bǔ)充一個我的經(jīng)驗(yàn)靜態(tài)鏈接也有代價體積會增加、多個庫之間可能有符號沖突、安全更新時不能只替換動態(tài)庫。但如果權(quán)衡部署穩(wěn)定性和行為一致性libiconv這種小而穩(wěn)定的庫靜態(tài)鏈接幾乎是當(dāng)下最平衡的選擇。2. 編譯前必須理清的三個平臺差異2.1 源碼與構(gòu)建體系先認(rèn)識GNU autotoolslibiconv的源碼包雖然是GNU項(xiàng)目但真正拿到手后發(fā)現(xiàn)它不止是“一堆C文件”而是基于autoconf/automake組織的一套標(biāo)準(zhǔn)構(gòu)建體系。解壓后你會看到configure、Makefile.in、config.h.in這些文件。它的構(gòu)建邏輯是先運(yùn)行./configure探測當(dāng)前系統(tǒng)的編譯器、頭文件、庫特性生成對應(yīng)的config.h和Makefile再執(zhí)行make編譯。這點(diǎn)很重要因?yàn)閃indows原生環(huán)境下沒有一個“標(biāo)準(zhǔn)shell”來跑configure腳本我們得想辦法讓這套autotools體系在Windows上活過來。三個平臺的實(shí)際差異主要集中在三處終端與shell環(huán)境、編譯器選擇、以及生成的目標(biāo)格式。下面這個表格幫大家快速對照平臺/場景默認(rèn)終端常用編譯器生成目標(biāo)macOSTerminalbash/zshclang自帶libiconv.aMach-O靜態(tài)庫Windows MSVCDeveloper Command Promptcl.exeiconv.libCOFF靜態(tài)庫Windows MinGWMSYS2終端或CMDgcc.exelibiconv.aPE靜態(tài)庫三條路線對應(yīng)三種不同的頭文件和庫格式不能混用。MSVC編譯出來的.lib不能給MinGW鏈接MinGW編出來的.a也不能給MSVC用。這是第一次做跨平臺編譯的人最容易忽略的地方。2.2 工具鏈準(zhǔn)備不同場景該裝什么macOS側(cè)只需要一個Xcode Command Line Tools。打開終端執(zhí)行xcode-select --install裝好就有clang、make、ar、ranlib這些基礎(chǔ)工具。要注意的是別用系統(tǒng)自帶的/usr/bin/make版本太老的問題實(shí)際用下來預(yù)裝的GNU Make 3.81編譯libiconv完全夠用不需要額外裝新版本。Windows MSVC路線有兩套準(zhǔn)備方式。一是裝完整版Visual Studio從“開始菜單”里打開“x64 Native Tools Command Prompt for VS”這個環(huán)境變量已經(jīng)幫你配好了cl.exe、nmake.exe和SDK路徑。二是只裝Build Tools命令行使用vcvars64.bat配置環(huán)境這條適合不想安裝完整IDE的人。我自己的項(xiàng)目用的是Build Tools路線因?yàn)闃?gòu)建服務(wù)器上不需要圖形界面。Windows MinGW路線準(zhǔn)備方式得細(xì)說。MinGW本身有很多發(fā)行版常見的是MinGW-w64但為了跑configure腳本和make我更推薦直接裝MSYS2然后在MSYS2里安裝mingw-w64-x86_64-gcc。這樣你既有MinGW的GCC工具鏈又有了一個Unix風(fēng)格的shell環(huán)境處理autotools構(gòu)建會順暢非常多。官方安裝包地址網(wǎng)上很容易找到安裝完成后在開始菜單打開“MSYS2 MSYS”終端執(zhí)行pacman -S mingw-w64-x86_64-gcc base-devel就能把編譯環(huán)境備齊。這里強(qiáng)調(diào)一下MSYS2里有兩套環(huán)境MSYS環(huán)境編譯出來的東西依賴MSYS運(yùn)行時MINGW64環(huán)境編譯出來的才是純Windows原生程序。我們做libiconv靜態(tài)庫必須在MINGW64環(huán)境中操作。2.3 靜態(tài)庫的產(chǎn)物形態(tài)與命名差異編譯完成后三種環(huán)境下得到的靜態(tài)庫文件名和格式都不同先建立這個預(yù)期后面驗(yàn)收時就能對號入座。macOS下產(chǎn)出的是libiconv.a這是一個Mach-O格式的靜態(tài)庫內(nèi)部的object文件后綴是.o用ar -t libiconv.a可以列出里面的成員。Windows MSVC下產(chǎn)出的是iconv.lib這是一個COFF格式的靜態(tài)庫但要注意MSVC的.lib有兩種情況一種是真正的靜態(tài)庫另一種是導(dǎo)入庫import library只是告訴你符號在哪個DLL里。我們編譯的是前者鏈接時直接把代碼合入exe。區(qū)分方法可以用dumpbin /headers iconv.lib查看文件頭或者在同一個目錄下看有沒有對應(yīng)的iconv.dll沒有DLL的話基本可以確定是真靜態(tài)庫。Windows MinGW下產(chǎn)出的是libiconv.a雖然擴(kuò)展名和macOS一樣但格式是COFF只能給MinGW的GCC鏈接器用。這三種格式互不通用這點(diǎn)必須牢記給MSVC工程用的庫不能拿MinGW編出來的.a去糊弄。3. 實(shí)操macOS上的靜態(tài)編譯3.1 獲取源碼與目錄規(guī)劃先到GNU官網(wǎng)的libiconv下載目錄拿源碼包我這邊用的是1.17版本穩(wěn)定且API變化不大。下載后執(zhí)行tar -xzf libiconv-1.17.tar.gz cd libiconv-1.17這里建議單獨(dú)建一個output目錄把編譯結(jié)果統(tǒng)一放進(jìn)去。因?yàn)槟J(rèn)的configure會把頭文件和庫文件安裝到/usr/local我不想污染系統(tǒng)的/usr/local更希望所有產(chǎn)物都收納在當(dāng)前工程目錄里方便后續(xù)打包。mkdir -p /tmp/libiconv-macos/build-output實(shí)際開發(fā)中我習(xí)慣在工程目錄內(nèi)建third_party/libiconv-macos這樣做的好處是第三方庫和項(xiàng)目源碼一起納入版本管理新同事拉下來不需要額外裝庫。不過這只是目錄組織的偏好核心編譯命令不變。3.2 configure參數(shù)逐個解釋在源碼根目錄指定--prefix為輸出目錄然后手動指定三個參數(shù)./configure \ --prefix/tmp/libiconv-macos/build-output \ --disable-shared \ --enable-static \ CCclang CFLAGS-O2 -arch arm64逐個說明這些參數(shù)的作用--prefix安裝路徑編譯完成后make install會把頭文件裝到build-output/include庫文件裝到build-output/lib。這相當(dāng)于一個“本地虛擬安裝”不碰系統(tǒng)目錄。--disable-shared明確禁止生成動態(tài)庫只生成靜態(tài)庫。libiconv默認(rèn)會同時編靜態(tài)和動態(tài)如果不禁用動態(tài)庫你會看到一堆.dylib文件那不是我們想要的。--enable-static雖然默認(rèn)靜態(tài)庫就是啟用的但顯式寫出來可以讓configure腳本的人一眼看懂意圖。CCclang指定編譯器。macOS上默認(rèn)CC可能是cc它其實(shí)是指向clang的但顯式指定更穩(wěn)當(dāng)。CFLAGS-O2 -arch arm64-arch arm64是針對Apple Silicon的如果是在Intel mac上編譯去掉這個參數(shù)或者改成-arch x86_64如果希望生成通用二進(jìn)制可以寫-arch arm64 -arch x86_64但要注意那樣生成的.a是胖二進(jìn)制體積會增大多數(shù)場景其實(shí)只需要當(dāng)前架構(gòu)。3.3 make與產(chǎn)物驗(yàn)證接下來執(zhí)行make -j8 make install-j8用8個并行任務(wù)編譯速度會快不少。如果機(jī)器配置一般改成-j4也可以。整個編譯過程的輸出里如果出現(xiàn)warning一般不影響最終結(jié)果但看到error就必須停下來看日志。編譯完成后檢查產(chǎn)物ls -la /tmp/libiconv-macos/build-output/lib正常情況下你會看到libiconv.a、libcharset.a兩個靜態(tài)庫以及l(fā)ibiconv.la這個libtool描述文件實(shí)際鏈接時用不到。頭文件方面include/iconv.h是我們要的東西include/libcharset.h是輔助頭通常不用直接引入。驗(yàn)證一下庫里的符號nm /tmp/libiconv-macos/build-output/lib/libiconv.a | grep _iconv_open看到_iconv_open和_iconv這幾個符號就說明編譯成功了。這里加下劃線是Mach-O的C符號命名規(guī)則在Windows的COFF里沒有這個下劃線前綴驗(yàn)證時不要對照錯。這一步我在某跨平臺終端工具中實(shí)際跑過一次整套下來不到兩分鐘。macOS下libiconv的編譯是三條路線里最順的主要原因是autotools體系本來就是為Unix-like系統(tǒng)設(shè)計的在這個環(huán)境里幾乎不會出幺蛾子。4. 實(shí)操Windows上的兩種編譯路線4.1 MSVC原生編譯讓autotools在Windows shell里干活MSVC路線麻煩一些因?yàn)閏onfigure是個shell腳本W(wǎng)indows CMD里沒法直接執(zhí)行而Developer Command Prompt又只提供了命令行環(huán)境沒有bash。解決辦法是先裝一個Git for Windows它自帶bash.exe可以在CMD里調(diào)用讓autotools腳本在bash環(huán)境中運(yùn)行但編譯器仍然指定為MSVC的cl.exe。大致的完整流程如下。先打開“x64 Native Tools Command Prompt for VS”在這個環(huán)境里已經(jīng)配置好了cl、nmake、SDK路徑。然后執(zhí)行set MSYS2_PATH_TYPEinherit C:\Program Files\Git\bin\bash.exe --login -i這樣進(jìn)入bash后環(huán)境變量繼承了當(dāng)前CMD里的MSVC變量。然后在bash里進(jìn)入源碼目錄執(zhí)行configure./configure --prefix/tmp/libiconv-windows-msvc \ --disable-shared --enable-static \ CCcl CFLAGS-O2 -MT這里CCcl是關(guān)鍵直接把編譯器指向MSVC的cl.exe。-MT參數(shù)讓運(yùn)行時庫使用靜態(tài)版這樣最終exe不依賴msvcp140.dll、vcruntime140.dll這些動態(tài)運(yùn)行庫程序復(fù)制到別的Windows機(jī)器上更容易跑起來。然后構(gòu)建時不能用make因?yàn)閍utotools生成的Makefile里寫用的是make而MSVC環(huán)境下更好用的是nmake。實(shí)際操作中我見過有人直接用make也過了因?yàn)镚it bash環(huán)境里帶了GNU Make它也能解析autotools生成的Makefile但最終調(diào)用CC時用的是cl所以核心還是MSVC工具鏈。穩(wěn)妥起見建議這樣執(zhí)行make -j8 make install如果中間報nmake相關(guān)的錯誤或者M(jìn)akefile語法問題可以嘗試把make改成用nmake -f Makefile.msvc但libiconv官方實(shí)際上沒提供完整的MSVC專用Makefile多數(shù)情況還是要走autotools生成的Makefile。實(shí)測Git bash里用GNU make是最順的方案。產(chǎn)物驗(yàn)證時檢查/tmp/libiconv-windows-msvc/lib目錄會得到iconv.lib和charset.lib兩個文件。用dumpbin /symbols iconv.lib如果能列出iconv_open等符號說明庫沒問題。注意MSVC的靜態(tài)庫沒有.a擴(kuò)展名鏈接時直接在Project屬性里加上這個iconv.lib即可。這一步我印象很深最初一直以為MSVC下必須手工寫DEF文件或者用第三方預(yù)編譯包繞了好大一圈才發(fā)現(xiàn)autotools在Git bash cl的組合下就能直接工作關(guān)鍵是CCcl變量別被bash默認(rèn)的gcc覆蓋掉。4.2 MinGW編譯最省心的一條Windows路線MinGW路線的體驗(yàn)是真的好很多因?yàn)镸SYS2環(huán)境天然就是Unix風(fēng)格的shell。打開“MSYS2 MINGW64”終端注意不是MSYS終端確認(rèn)gcc -v能看到x86_64-w64-mingw32-gcc然后進(jìn)入源碼目錄直接執(zhí)行./configure \ --prefix/tmp/libiconv-mingw64 \ --disable-shared \ --enable-static \ CCgcc CFLAGS-O2 -static-libgcc -static-libstdcMinGW下GCC默認(rèn)鏈接libgcc的某些部分還是動態(tài)引入的如果希望最終exe完全獨(dú)立運(yùn)行-static-libgcc能避免對libgcc_s_seh-1.dll的依賴。libiconv的源碼本身是純C不依賴libstdc但加上這個參數(shù)能防止后續(xù)自己的項(xiàng)目里鏈接了C代碼時被動態(tài)庫問題偷襲。當(dāng)然如果項(xiàng)目里沒有C代碼-static-libstdc可加可不加。然后make -j8 make install這個過程一般非常順利基本一條命令走到黑不會像MSVC路線那樣有各種環(huán)境變量問題。產(chǎn)物檢查ls /tmp/libiconv-mingw64/lib你會看到libiconv.a、libcharset.a。注意這里的libiconv.a和macOS下的libiconv.a雖然文件名一樣但格式不同一個是COFF一個是Mach-O不能交叉使用。驗(yàn)證符號時使用nm /tmp/libiconv-mingw64/lib/libiconv.a | grep iconv_openMinGW的COFF符號不像MSVC那樣帶下劃線前綴但nm輸出中可能顯示為T iconv_open、T _iconv_open這是因?yàn)镸inGW內(nèi)部對符號名做了修飾實(shí)際鏈接時用-liconv就行了不需要你手動處理前綴問題。我在某個Windows數(shù)據(jù)采集客戶端里用的就是這套MinGW編譯的靜態(tài)庫配合-static和-static-libgcc最終exe在幾臺沒裝任何運(yùn)行庫的干凈Windows測試機(jī)上都能直接跑起來效果很理想。4.3 兩種Windows路線的選擇建議MSVC和MinGW兩條路線各有領(lǐng)土不是一個替代另一個的關(guān)系。如果項(xiàng)目主工程是Visual Studio解決方案那肯定選MSVC編譯的iconv.lib因?yàn)閂S工程無法直接鏈接MinGW的.a文件。反過來如果項(xiàng)目用CMake且工具鏈?zhǔn)荕inGW或者你在做跨平臺腳本構(gòu)建MinGW路線更合適因?yàn)樗臉?gòu)建過程幾乎無摩擦。另外有一點(diǎn)需要提醒很多在線教程會直接讓你下載別人編譯好的iconv.dll或libiconv.a塞進(jìn)項(xiàng)目里這種做法在個人小工具里可能行得通但放到正式產(chǎn)品里會埋雷。來源不明的二進(jìn)制無法保證和源碼版本一致、無法復(fù)現(xiàn)構(gòu)建過程也說不清有沒有被人動過手腳。自己走一遍編譯流程并不難卻能把這些問題一次解決干凈。5. 典型編譯報錯與排查實(shí)錄5.1 configure階段找不到編譯器或者頭文件最常見的報錯是checking for gcc... no checking for cc... no configure: error: no acceptable C compiler found in $PATH這個八成是工具鏈沒配置好。在MSVC路線下忘了在正確的Developer Command Prompt里啟動git bash就會這樣在MinGW路線下開了MSYS終端而不是MINGW64終端也會這樣。排查方法是先執(zhí)行which cl which gcc如果輸出為空說明工具鏈不在PATH里回到工具鏈配置那一步檢查。另一個常見錯誤是configure: error: C compiler cannot create executables這時候要往前面翻日志看具體原因?,F(xiàn)在常見的是缺少對應(yīng)的SDK鏈接庫。MSVC環(huán)境下如果你用Build Tools而不是完整Visual Studio很容易漏裝Windows SDK的庫文件部分導(dǎo)致鏈接測試程序時失敗。解決方法是回到Visual Studio Installer里勾選“使用C的桌面開發(fā)”工作負(fù)載確保Windows SDK組件已經(jīng)裝上。5.2 編譯到一半卡在某個源文件如果報錯說某個.c文件找不到頭文件比如stdlib.h或stdio.h多半是頭文件搜索路徑?jīng)]配好。MSVC環(huán)境下要確認(rèn)環(huán)境里執(zhí)行過vcvars64.batMinGW環(huán)境下要確認(rèn)mingw-w64-x86_64-gcc以及配套的頭文件包已經(jīng)裝好。MSYS2可以用pacman -S mingw-w64-x86_64-gcc和pacman -S mingw-w64-x86_64-headers來補(bǔ)齊。c89/c99標(biāo)準(zhǔn)相關(guān)的warning不用怕舊版本的libiconv源碼用的是老式C風(fēng)格在GCC的新版本下會刷出一堆declaration warning不影響生成目標(biāo)代碼。只要沒出現(xiàn)error讓它編完就好。5.3 鏈接階段的最典型翻車現(xiàn)場我記得在某跨平臺圖像處理Demo里接過這樣的報錯cannot find -liconv排查方法很簡單確認(rèn)libiconv.a真的存在于指定的-L目錄中且文件名沒有拼錯。GCC的-liconv默認(rèn)尋找的是libiconv.a或libiconv.so。如果你把文件命名成iconv.lib那MinGW的GCC是找不到的必須改名或者在CMakeLists里顯式指名-l:libiconv.a。還有一個MSVC下容易踩的坑鏈接iconv.lib時報LNK2001外部符號無法解析比如_iconv_open無法解析。原因往往是頭文件部分已經(jīng)通過MSVC編譯但編譯器實(shí)際生成的符號名和你用頭文件聲明的不同。最常見的是iconv.h里定義了iconv_open為libiconv_open的宏或者反過來。libiconv的頭文件里有一系列宏用來處理不同平臺下名字可能是iconv_open還是libiconv_open的問題。如果出現(xiàn)奇怪的符號沖突可以打開iconv.h查閱LIBICONV_PLUG相關(guān)宏定義或者直接在代碼里調(diào)用libiconv_open試試配合nm查看靜態(tài)庫里實(shí)際導(dǎo)出的符號名來確認(rèn)。5.4 看似成功但運(yùn)行時行為怪異這個坑很少人提但很陰編譯出的靜態(tài)庫本身沒問題鏈接也成功但程序運(yùn)行到字符轉(zhuǎn)換時返回(size_t)-1errno是EILSEQ。這種問題往往和庫本身無關(guān)而是編碼名不對。libiconv支持的編碼名是特定的比如UTF-8、GB2312、BIG5但如果你傳的是utf8或GBK這種變體某些版本上會識別不出來。穩(wěn)妥做法是用iconv -l列舉系統(tǒng)支持的編碼名——在libiconv源碼目錄里編譯出一個iconv命令行工具然后./iconv -l查看。這個工具在編譯過程中自然會生成位于./tools/iconv或源碼根目錄下不同版本位置略有差異。5.5 常見問題速查表癥狀最常見原因排查/解決方向configure: no acceptable C compilerPATH里沒有編譯器檢查which cl/gcc確認(rèn)工具鏈環(huán)境C compiler cannot create executables缺SDK鏈接庫重新安裝Visual Studio組件或MinGW-w64依賴包找不到iconv.h頭文件搜索路徑未包含include目錄-I指向build-output/includecannot find -liconv庫文件不在-L路徑或命名不對確認(rèn)libiconv.a存在且文件名正確MSVC下LNK2001符號無法解析編碼名宏沖突或者靜態(tài)庫與編譯器格式不匹配檢查iconv.h宏定義用dumpbin查看庫的實(shí)際符號運(yùn)行時返回EILSEQ編碼名不被識別用iconv -l查官方支持的編碼名鏈接成功但exe缺DLL編譯時沒開-static或-MTMinGW加-static -static-libgccMSVC用/MT6. 把靜態(tài)庫接進(jìn)項(xiàng)目的幾個實(shí)際建議6.1 頭文件與宏定義的正確搭配使用靜態(tài)庫時編碼轉(zhuǎn)換代碼里的頭文件寫法要注意#include iconv.h但如果你的項(xiàng)目同時可能接觸到系統(tǒng)自帶的iconv需要重點(diǎn)審視iconv.h里L(fēng)IBICONV_PLUG這個宏。這個宏存在是為了做兼容層設(shè)計當(dāng)系統(tǒng)已經(jīng)有一個iconv時可以通過定義LIBICONV_PLUG讓libiconv使用系統(tǒng)iconv的符號名但當(dāng)我們靜態(tài)鏈接自己編譯的libiconv時通常不需要定義這個宏直接讓libiconv把自己的iconv_open等符號暴露出來即可。為了避免符號沖突libiconv其實(shí)把實(shí)際導(dǎo)出符號定義成了libiconv_open等帶前綴的名字然后通過宏在頭文件里映射成iconv_open。這意味著如果你同時鏈接了其他也提供iconv_open的庫就會出現(xiàn)重復(fù)定義或者符號被覆蓋。解決思路是在編譯自己的C文件時統(tǒng)一使用#define LIBICONV_PLUG或統(tǒng)一不定義并確保所有源文件使用同一個iconv.h頭文件不要讓不同編譯單元各看各的頭文件。這一點(diǎn)在大型項(xiàng)目里尤其重要分散在多個CMakeLists里的子項(xiàng)目很容易出現(xiàn)“有的編譯單元用系統(tǒng)頭有的用libiconv頭”的混亂局面。6.2 CMake集成示例如果是CMake工程以下是我實(shí)際在用的模板支持三個平臺自動選擇對應(yīng)的靜態(tài)庫if(APPLE) set(ICONV_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libiconv-macos/lib/libiconv.a) set(ICONV_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libiconv-macos/include) elseif(WIN32 AND MSVC) set(ICONV_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libiconv-msvc/lib/iconv.lib) set(ICONV_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libiconv-msvc/include) elseif(WIN32 AND MINGW) set(ICONV_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libiconv-mingw64/lib/libiconv.a) set(ICONV_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libiconv-mingw64/include) endif()CMake里引用時add_executable(my_tool main.c) target_include_directories(my_tool PRIVATE ${ICONV_INCLUDE_DIR}) target_link_libraries(my_tool PRIVATE ${ICONV_LIBRARY})注意在Windows下最好再給my_tool傳入/MT或-static相關(guān)flag讓整個可執(zhí)行文件不依賴運(yùn)行時DLL。這屬于工程級配置和libiconv本身無關(guān)但直接決定最終產(chǎn)品能否“一個exe走天下”。6.3 統(tǒng)一的二進(jìn)制符號處理在Windows上如果你同時使用MSVC編譯的某個庫和MinGW編譯的libiconv那么至少要確認(rèn)所有庫都是用同一套C運(yùn)行時編譯的。MSVC有/MD動態(tài)運(yùn)行庫和/MT靜態(tài)運(yùn)行庫之分MinGW有-static和動態(tài)之分混著鏈接輕則鏈接告警重則運(yùn)行時崩潰。最省心的策略是整個項(xiàng)目統(tǒng)一用靜態(tài)運(yùn)行時MSVC每個編譯單元都加/MTMinGW統(tǒng)一加-static -static-libgcc。這樣它們之間的內(nèi)存管理、CRT啟動邏輯才能保持一致否則一個庫在A運(yùn)行時里malloc、在B運(yùn)行時里free結(jié)果往往是一聲不吭地崩掉。7. 關(guān)于編譯性能與庫體積的補(bǔ)充思考靜態(tài)庫寫進(jìn)exe之后體積增幅是很有限的。我實(shí)測libiconv 1.17在MinGW編譯、O2優(yōu)化下libiconv.a大約幾百KB鏈接進(jìn)exe后最終二進(jìn)制增幅也就在百KB級別。對現(xiàn)代程序來說這點(diǎn)體積完全可以接受。但如果你的場景極度敏感可以考慮裁剪編碼支持在configure時指定--enable-extra-encodings之類的參數(shù)或者編譯后手工裁剪不需要的編碼表。不過這不是常規(guī)操作而且libiconv的編碼數(shù)據(jù)多半是靜態(tài)表裁剪收益不大風(fēng)險卻不小——真用到被裁掉的編碼時你根本想不到是這個原因。所以我個人建議保持默認(rèn)全量編譯省心最重要。編譯速度方面三個平臺基本都在分鐘級以內(nèi)幾乎不構(gòu)成工程瓶頸。反而是版本升級和重新編譯的流程更容易被忽視update libiconv后務(wù)必同時更新三個平臺的靜態(tài)庫和頭文件避免Mac上用了新版、Windows還在用舊版結(jié)果同一套源碼在兩邊行為不一致。這種跨平臺差異類bug比編譯錯誤難查一個數(shù)量級。8. 一些經(jīng)驗(yàn)總結(jié)與避坑心得走了這幾輪編譯流程幾個體會非常深。第一別小看環(huán)境變量和路徑問題。三套路線的大多數(shù)報錯都集中在“工具鏈沒在這個終端里生效”而不是代碼本身。每次編譯前先在終端里執(zhí)行which gcc、cl或xcode-select -p確認(rèn)工具鏈在位能省掉大量看起來莫名其妙的報錯。第二不同平臺的產(chǎn)物命名差異要提前接受。macOS下的libiconv.a、MSVC下的iconv.lib、MinGW下的libiconv.a文件名只是表象真正要緊的是靜態(tài)庫格式和符號規(guī)則。把它們按平臺放進(jìn)不同的third_party目錄用CMake或類似構(gòu)建系統(tǒng)做平臺分支才是最省力的管理方式。第三不要用網(wǎng)上隨手下載的預(yù)編譯庫替代自己編譯。并不是說所有第三方預(yù)編譯包都有問題而是你無法確認(rèn)它的編譯參數(shù)、版本和完整來源這在正式項(xiàng)目里引入的風(fēng)險完全不值得。自己編譯的靜態(tài)庫至少你清楚它來自哪個版本源碼、用了什么CFlags、包含哪些模塊。第四碰到奇怪的鏈接錯誤第一步永遠(yuǎn)是nm或dumpbin查看靜態(tài)庫的真實(shí)符號不要憑頭文件猜。頭文件里的宏映射和實(shí)際導(dǎo)出符號之間的偏差是這類工作里最棘手也最常見的坑。最后再分享一個小技巧編譯好的三個平臺靜態(tài)庫和頭文件我會連同源碼版本號一起歸檔在項(xiàng)目倉庫的third_party/libiconv-1.17目錄下目錄內(nèi)放一個README.md記錄每套庫的編譯時間、編譯器版本、configure參數(shù)。三個月后再來維護(hù)這個項(xiàng)目或者有新同事接手看到這份記錄能省下大把重新摸索的時間??缙脚_靜態(tài)庫這活兒本身的編譯時間不長真正容易出問題的全是“當(dāng)時沒記錄下來的細(xì)節(jié)”。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月丁香六月情婷婷久久| 大香蕉色婷婷伊人在线| 99精品偷自拍| 人妻videos人妻高清| 538在线精品| 久草热久草在线视频| 2023天天日夜夜爽| 91精品综合久久婷婷九色| 超碰高清在线| 五月六月激情婷婷| 伦乱人妻| 色99在线观看| 99自拍视频在线观看| 色色色免费视频| 99热99思午夜精品| 婷婷伊人75| 丁香五月综合激情啪啪| 日本成人噜噜噜噜噜| 久久免费少妇高潮99精品| 六月丁香激情| 婷婷激情鹿城五月天| 色私五月婷婷| 五月六月婷婷| 六月婷婷激情图片| WW婷婷五月天com| 婷婷精品在线| 亚艹艹| 美女被操一区二区| 天天日天天舔| EEUSS鲁片一区二区三区| 熟女网站久久| 99在线看视频| 91操人视频| 99日韩网站| 99亚洲精品视频| 丁香六月在线综合| 狠狠干狠狠色| 97久久精品| 婷婷五月激情中文字幕| 夜夜操,天天撸| 成人午夜无码视频| 久操干| 思思热在线视频精品| 狠狠搞狠狠操| 26UUU在线观看| 1024婷婷综合久久五月天| 五月丁香久久| 日韩啪啪视频| 丁香综合网| 亚洲AV成人一区二区在线观看| 国产va在线视频| 啪啪婷婷五月天激情| 99国产精品久久久久久久久久久| 可以直接看的av| 亚洲热综合网在线观看| 九九热在线视频,| 五月丁香六月在线欧美| 成人av观看| 婷婷亚洲久久| 99视频日韩| 成人做爰A片免费看视频| 亚洲成人免费在线| 亚洲精品乱码久久久久99| 99久久婷婷国产综合| 激情综合在线观看| 亚洲成人av在线| 人人叉久| 色色日本欧美| 丝袜激情网| AA久久| 五月婷婷日| 久久久99免费视频| se色婷婷视频| 少妇人妻人伦A片| 天天婷婷| 五月天a婷婷伊人| 91婷婷五月丁香碰| 五月丁香婷婷狠狠操| 开心激情网五月天| 色婷婷亚洲| 丁香成人色情五月天| 丁香五月婷婷久久综合激情网| 婷婷五月天av网| 日本久久极品| 久色激情| 亚洲AAAA网| 精品久久久久久久久久久久人妻| 超色欲天天| 久久综合影院| 久久婷婷青青草| 9热成人在线视频| 欧美一黄一色一乱一伦| 99九九视频精彩在线| 99日本黄站| 色婷插| 思思99久久| 天天干-天天日| 婷色五月| www99在线观看视频| 99re资源在线视频导航| 丁香婷婷激情网站| 无码人妻少妇色欲AV一区二区 | 成熟妇人A片免费看网站| 激情六月综合| 欧美日韩123| 丁香五月天电影| 九九在线免费观看| 欧美精品99久久久| 中文字幕欧美日韩VA免费视频| 欧美色色色色色色色| 狠狠色成人影片| 中文字幕成人| 男女啪啪做爰高潮无遮挡| 在线理论片| 久久婷婷的综合色丁香五月| 中文字幕成人| 国产精品视频| 丁香婷婷天堂| 日本高清综合网五月丁香| 婷婷五月天激情在线观看| 欧洲激情网站| 久久之人妻| 色综合狠狠色| 91丁香五月| 五月丁香自拍| 五月丁香婷婷色色| 婷婷五月天中文字幕.| 婷婷伊人网| www,色婷婷| 五月天天堂久久| 五月婷婷草| 碰碰碰91| 性爱视频久久| 97色色视频| 五月丁香久久| 极品少妇高潮啪啪AV无码| 成人婷99最新| 强辱丰满人妻HD中文字幕| 成片免费播放| 久久激情网| 日本综合久久| 亚洲色久| 九九热精品视频在线观看| 婷婷爱五月| 丁香五月偷拍| 久久婷婷五月天大香蕉| 99色免费在线观看| 丁香久久综合| 欧美噜噜免费观看| 99免费视频精品| www色五月天| 九九操综合网| 久久怕怕视频| se99视频| 欧美69久成人做爰视频| 人妻22p| 9l视频自拍9l九色成人| 少妇AB又爽又紧无码网站| 久久久一级AAA| 69人人操人人爽| 啪精品| 婷婷色基地| 成人日韩欧美| 噜噜噜噜噜日本视频| 色婷狠狠| 国产操B视频| 偷拍五月丁香| 色综合色五月| 免费观看18视频网站| 综合在线网| 婷婷成人五月天成人文学| 超碰成人影视| 91操熟女| 婷婷激情五月| 天天拍夜夜撸| 日韩抽插操逼| 激情综合网五月天| 亚洲五月天激情| 丰满少妇乱A片无码| 9色小视频在线观看| 婷婷中文字幕网| 久久久激情| xx综合网| 婷婷色五月丁香六月欧美啪| 丁香五月性| 农村熟妇高潮精品A片| 激情5月婷婷| 第五婷婷伊人丁香| 色色99色色| 久久99成人性爱高清视频| 久久五月激情| 99激情网| 色五月婷婷网| 深爱婷婷丁香五月激情| 五月天激情国产综合婷婷婷就去爱| 欧美成人精品老美女噜噜噜| 婷婷天堂综合| 五月婷视频在线观看| 久久色五月天| 热九九精品| 丁香五月婷婷综合视频| 久久码久久无清| 日韩狠狠色| 99er6| 久久九九思思| 99九九视频| 开心五月色婷| 久久丝丝热| 色婷婷色综合久久精品V| 五月婷婷中文字幕AV| 久热伊人| 182TV大香蕉| 色色a| 级人人91| 大香蕉手机视频| 五月丁香亚洲婷婷| 无码日本精品XXXXXXXXX| 激情婷婷狠狠干综合| 97se视频在线| 婷婷综合在线观看视频| 日本色色色| 婷婷五月综合社区在线| 伊人大香五月天| 五日激情综合| 99热免费| 国产日韩av片| 偷拍99在线视频观看| 五月天播播| 99热九九这里只有精品10| 五月激情四射网站| 国产精品扒开腿做爽爽爽A片唱戏| 99视频内射三四| 五月婷婷香蕉| 久九男女天堂| 开心激情网在线| 99热这里只有精品搜| 很很操96| 99热国产在| 亚洲色图45p| 综合色色五月| 婷婷色五月开心五月| 色婷婷香蕉| 丁香五月婷婷Av| www.99热这里精品| 有哪些A片网站| 成人五月天丁香婷| 日韩美一级毛卡片| 六月婷伊人| 亚洲人成网站999综合| 99热综合| 成人网在线视频| 五月丁香基地| 狠狠色噜噜色狠狠狠综合久久成人波 | 伊人影院久久网| 日本欧美成人片AAAA| 亚洲人人操BD| 亚色网站小视频| 亚洲第一黄网| 日本三级大片| 色黑鬼导航| 玖玖国产视频一区| 婷五月天在线草| 性韩日色婷婷五月天激情啪啪XXX| 超碰cap| 嫩草极品| 9精品国产在热久久| 色婷婷成人做爰A片免费看网站 | 99精品在线观看| 97精品在线| 色婷婷丁香五月| 天天日天天舔| 桔色成人在线| 香蕉视频91| 久久婷婷综合国产| 激情五月五月婷婷| 热热色色五月天婷婷| 激情人妻蜜夜系列区| 91丁香色| 久久婷婷婷| 中文无码婷婷| 婷婷丁香高潮了| 99re这里只有精品免费| 99re最新地址| 伊人婷婷五月天| 99综合免费视频| 亚洲天堂久久| 婷婷久久欧美| 五月天激情黄色小说在线观看| 五月婷婷综合成人| 激情婷婷色色| 97婷婷丁香五月| 丁香五月婷婷欧美成人色图| 九热免费视频| 99国产精品久久久久久久久久久| 丰满老熟妇BBBBB搡BBB| 天天色综和网| 色五月综合| AA丁香综合激情| 熟惀91九色在线| www.99情趣网| 久久精品66| 肏屄色播伊人97婷婷| 国产成人精品一区二区三区视频| 激情的五月婷婷蜜桃| 91 九色 熟女| 国产伦亲子伦亲子视频观看| 丁香五月 无码| 五月天婷婷狂暴白浆| 老妇六区| 国产精品国产| 亚洲成人在线观看av| 久综合4| 色五月开心久久网| 激情综合久久| 久久这里只有精品无码| 美女天天爽| 综合色综合| 热99视频| 国产激情在线| 免费无码毛片一区二区A片| 日本玖玖在线| 久久综合丁香五月| 99热这里只有精品10| 成人国产综合| 99精品视频在线观看| www.精品久9| 婷婷五月天直播| 狠狠干天天日| 日韩精品呦呦va| 五月天激情黄色小说在线观看| 9精品视频在线| 天天爽夜夜爽夜夜爽精| 亚洲午夜视频| 99精品高潮| 婷婷欧美色| 超碰资源在线| OUMEIRIHANCHENGREN| 97亚洲婷婷| 婷婷色五月天综合网| 涩五月婷婷| 国产AV一区二区三区日韩| 无码人妻激情| 91人人操人人爱| 天啪天啪天啪天啪| 婷婷五月情天| 五月天大香蕉AV| www.com操| 99综合网| 99啪啪视频| 99色热视频在线| 中文字幕在线视频播放| 99久久久| 日日操日日撸| 久久婷婷青草五月天| 丁香美女五月天婷婷| 亚洲成人电影在线免费观看| 激情综合亚洲色婷婷五月| 这里只有精品69| 国内外色色色色色成人视频| 色婷婷丁香女女| 中文字幕综合网| 午夜做爱影院| 无码激情AAAAA片-区区 | 噜噜噜色噜噜| 99这里只有精品|v| 69超碰在线| 国产在线黄色| 日撸夜撸日操| 国内外色色色色色成人视频| 99九九精品视频| 一区二区三区四区无码| 超碰久热| 午夜丁香| 日本色图综合| 色婷婷AⅤ| 五月丁香欧美| 99网| 亚洲一个色| 51国精产品自偷自偷综合| 日本成人噜噜| 无码少妇高潮喷水A片免费| 欧美人久久| 九九性视频| 午夜成人片400| 亚洲激情av| 荷兰av一级| 丁香五月激情啪| 婷婷色基地| 五月丁香综合影院| AAA久久| 99久久思思| 大香蕉丁香婷婷| 五月天激情久久| 精品99在线| 五月婷色| 婷婷五月天美女视频| 亚洲人人艹| 色婷婷888| 色八月婷婷| 成人五月天丁香婷| 激情丁香网| 久久38视频| 欧美婷婷日本| 这里只有精品视频一区| 丁香色色色| 性一交一乱一交A片久| 99热成人在线| 99久久99视频只有精品| 99在线视频喷水| 九九99九九99| 99re这里有精品手机在线| 色色色色色五月| 色综合色色色| 五月婷婷丁香六月| 久久有码| 婷婷色色五月| 丁香久久九九99| 中文AV网站| 天天插天天插天天插| 成人AV免费观看| 熟妇内谢69XXXXXA片| 婷婷久久精品| 色五月丁香六月婷婷| 丝袜人妻| 激情熟女网| 99精品在线观看| 99亚洲精品视频| 激情五月深爱五月| 182TV大香蕉| 国产性av| 国产精品一区在线观看你懂的| 2015好吊操| 毛v一区二区视频| 五月丁香网站| av九九| 五月天成人在线播放丁香| 亚洲丁香花色| 欧洲S级在线观看| 丁香网五月天| 中文AV在线播放| 女人被男人吃奶到高潮| 超碰在线成人| 国产精品久久久久久久久久免费| 欧美va精品va老师va| 久久九色| 丁香六月毛片| 人人草碰| 婷婷中文在线| 国产熟女一区二区三区五月婷| 另类小说激情五月天| 激情丁香五月天图片| 婷婷五月天AV| 色综天天综合| 五月天丁香婷婷视频网址| 97色色色色色| 在线中文字幕视频| 欧美搡BBBBB摔BBBBB| 五月丁香六月婷婷a v| 大大香蕉综合在线| 丁香五月影视| 丁香五月另类小说在线阅读| 色综合久久8| 美欧成人视频| 26uuu色噜噜精品一区| 蜜乳av一级av| 天天噜| 亚洲小视频免费播放| 日韩成人无码| 婷婷色五月色| 五月丁香六月停停| 久久 视频这里只有精总| 五月天婷婷伊人| 密臀久久| 婷婷综合伊人丁香| 99无吗| 开心激情网在线| 婷婷五月天激情五月天| 狠狠狠狠狠干| 久久九九网| 色婷婷电影网| 免费精品99| 九九热最新| 婷婷在线视频| 婷婷碰碰| 精品爆操| 久热只有这里有精品| 色五月综合网| 99热久久最新地址| 丁香五月天在线| 精品久久这里热66| 99热这里只有精品55| 久久小视频| 激情又色又爽又黄的A片| 1024国产在线| 五月婷婷综合社区| 五月天婷亚洲综合在线嫩草网| 97人人操| 亚洲中文无码成人| 综合综合网| 丁香五月激情综合| www.久久久久| AV大片在线观看| 99ri精品在线| 婷婷丁香五另类网站| 99国产性感视频| 五月婷视频| 五月天亭亭俺也| 国产黄大片在线观看画质优化| 五月色网| 在线91日韩| 99热超碰在线| 四色99久久| www.久久久.com| 激情五月天综合网| 婷婷五月精品中文字幕| 丁香六月高清视频| WWW.开心五月天.COM| 丁香六月久久| 免费看欧美成人A片无码| 性爱五月婷婷| 丁香六月婷婷开心| 成人视频在线免费播放| 色噜噜狠狠色综无码久久合欧美| 天天色2017| 99亚洲精美视频在线观看| 色色综合无码| 国产精品色色| 天堂婷婷综合| 99热99ai| 亚洲在线资源| www九月婷婷| 99色色热| 丁香婷婷五月色成人网站| 久久精品国产一区二区三区四区| 日操熟女| 深爱激情AV| 伊人www22综合色| 琪琪色五月婷婷老师| 久激情网| 97色天堂| 婷婷五月综合基地| 综合在线丁香五月| 色色婷婷五月天| 五月婷婷婷综合网| 欧美成人色婷婷| 少妇人妻偷人精品无码视频新浪| 視频福利乱色| 天堂AV在线看| 日韩在线观看网址| 开心丁五月| 五月丁香啪啪啪综合网| 99热99草97| 婷婷五月六月丁香综合| 中文字幕日本最新乱码视频| 天天网站天天爽| 亚洲五月婷| 99啊精典免费视频| 91婷婷五月天嫩女| 狠狠 久久| 色婷婷五月天综合网| 97色色网| 少妇激情五月婷婷| 国产做A爰片毛片A片美国| 丁香五月天在线观看视频| 亚洲情色一区| 棕合影院色色| 我去色色网五雨天| 五月婷婷色播| 中美日韩成人在线| 97干在线视频| 日本色色网| 久久婷婷综| 五月婷婷色影院| 日本久久人| 婷婷激情小说| 另类国产区| 婷婷五月色激情欧美激情| 久久码久久无清| 五月天婷婷激情在线色图| 婷婷亚州综合| 婷婷六月天| 精品99在线看| 99久久婷婷国产综合精品草原| 婷婷国产五月天17c| 婷婷五月伦理网站| 六月丁香狠狠爱| 日本色婷婷| 9热视频在线观看| 国产激情AV| 丁香五月婷婷久久综合激情网 | 日日天天干| 思思99热这里只有精品| 三男玩一女三A片| 九九这里精品| 久热爱大香蕉在线蜜臀悦色| 99这里都是精品| 中文字幕AV在线播放| 91精品久久久久久综合五月天| 碰超在线九色| 日韩欧美颜射| 爱草视频在线观看| 婷婷激情四射五月天| 99久精品视频| 亚洲人成网亚洲欧洲无码久久| 9l视频自拍九色9l视频自拍九色9l社区| 成人久碰| 色五月天堂| 久久五月天合网| 免费看成人AA片无码视频吃奶| 激情婷婷五六月天| 久久久久久18| 色情婷婷五月天| 五月天婷婷永久免费视频| 亚州激情九月| 九九热视频在线观看| 欧美一级操逼视频| 丁香六月激| 色天使色综合| 另类在线| 五月天婷婷激情在线色图| 天天爽在线视频| www,999日本色| 久狠狠狠| 久久综合伊人综合在线| 狼友视频在线观看18| 国产精品人人做人人爽人人添| 国内婷婷丁香社区在线播放| 丁香婷婷婷五月综合色情| 99ri视频| 丁香色婷婷| 狠狠色婷婷7| 人人操碰| 搡BBBB搡BBB搡18| 六月天婷婷| 欧美综合丁香网| 久久 婷婷 五月天| 九九成年视频| 成AV人片一区二区三区久久| 久久久久久久久99精品| 99日韩网站| 色婷婷久久综合久色| 啪啪夜久久| 狠狠五月婷婷| 国内外色色色色色成人视频| 日韩成人av在线| 丁香五月婷中字幕| xfplayav在线| 激情五月图| 激情99| 色综合久久88色综合天天| 性做爰1一7伦| 天天操天天插| 狠狠色综合网| 另类专区在线| 超碰不卡在线| 狠狠色成人影片| 色五月首页| 久久五月婷综合网| 日日操夜夜爽白洁| 新久久五月天激情| 色色五月婷婷| 99精品在线| av在线激情| 丁香六月婷婷开心婷婷网| 婷婷五月天av小说| www九九免费视频| 国产AV一区二区三区最新精品| 五月天婷婷成人| 六月天丁婷婷| 爱婷婷久久视频| 婷婷五月天影视| 久久er九九| 天天日夜夜B久久| 五月丁香六月婷综合成人综合| 无码激情AAAAA片-区区| 色人久久| 少妇熟女视频一区二区三区| 成人做爰A片免费看视频| 亚洲成人在线播放| 欧美日韩中文国产一区发布| 风流少妇A片一区二区蜜桃| 严洲天天插| 操人久久| 啪啪五月婷婷| 婷婷玉月丁香五月在线视频| 五月婷色| 亚洲色图五月丁香| 久久99激情丁香婷婷小说网| 人与禽A片啪啪| 激情综合五月| 中文字幕成人影视| 99综合入口| 亚洲瑟瑟精品在线| 欧美色色色| 五月婷婷色色色| 99视频在线| 婷婷碰碰| 久久久五月激| 欧美槡BBBB槡BBB少妇| 伊人久久婷婷| 久久久久久久久久久久久久久久久精典| 婷婷五月丁香超碰| 久操福利| 色综合网上班开心婷婷久久| 婷婷的五月天另类视频| 俺去也在线www色官网| 婷婷五月中文在线视频| 五月丁香婷婷色色色| 亚洲五月天激情| 五月天丁香婷婷久久九| 婷婷欧美激情| 亚洲俩性性爱图片久久第六页| 成人AV在线电影| 五月丁香婷婷AV天堂| 丁香婷婷综合激情五月色| a久久| 91九色首页| 婷婷天堂伊人| 五月伊人网| 99热日| 日本天堂免费99| www.久久久久| 色综合香蕉视频| 99久久99视频只有精品| 色婷婷婷婷五月天| 日本99久久| 亚洲激情四谢| 久久九九色| 琪琪色综合网站| 91免费看片| 亚洲熟妇AV综合网五月丁香伊人| 国产片天天爽夜夜爽| 小视频一区 | 九九99香蕉在线视频播放| 婷婷视频网| 丁香五月婷婷久久久| 久久曰曰| av色色国产| 大香蕉综合网| 91久久综合| 五月婷婷婷婷婷婷艺术| 夜夜干 夜夜操| 色婷婷玖玖影院| 色综合天天网| 成片免费播放| 97久操| 五月天婷婷色播| 亚洲色综合| 超级碰碰视频无码| 天天色天天舔天天爱天天爽| 久久这里有精品| 99人人精品| 九九无码视屏| A片试看50分钟做受视频| 在线中文字幕av| 五月丁香激情综合久久| 97人人干视频| 久色五月婷婷综合| 激情综合网激情五月天| 五月天综合久久| 亚洲热热视频| 激情综合文学| 69午夜成人影片| 五月天婷婷基地| 五月婷婷影院| 91丨九色丨白浆| 人人操91色| 91dy.av| 无码日本精品XXXXXXXXX | www.色五月天.com| 婷婷 丁香 久久| 色婷婷综合久久久久| 婷婷五月天视| 91无码一起草| 囯产精品久久欠久久久久久九大| 久草五月丁香婷婷综合| 狠狠肏综合网| 中文字幕丰满乱孑伦无码专区| 天天操夜夜玩!| 9久久久久久久久久久| 26uuu国自产精品| 国产亚洲精品久久久久久久久动漫 | 日韩中出视频| 丁香欧美| 丁香婷婷五月激情四射网| 丁香激情五月| 丁香五月瑟瑟| 97人妻碰碰碰碰碰久久久久久| 99九九精品| 91操片| 99精品国产乱码久久久人妻| 26uuu欧美日本| 狠狠久久婷五月| 成人国产欧美大片一区| 久热免费| 九九综合精品| 久久久九九九 99| 婷婷金品综合视频| 欧美色欲色欲天天天www| 五月丁香综合成人社区| 永久AⅤ1| 999热在线观看视频| 丁香婷婷视频| 色狠狠999综合| 婷婷五月激情综合| 26uuu美女三级视频| 做爰丰满少妇1313| 五月婷婷激情综合视频| 操操精品| 91丨九色丨熟女高潮| 夜夜爽天天| 91五月天| 久久精典| 久久这里精彩免费在线观看| 伊人AV五月婷| 97人人干人人操| WWW色色色COM| 五月激情婷婷播播网| 国外亚洲成AV人片在线观看| 性爱网五月婷婷| 五月丁香色综合| 日韩美女羞羞网站在线观看| 色狠狠色噜噜AV天堂五区消防| 五月丁香婷婷欧美| 九九热99热| 1024欧美看片| 五月丁香婷婷六月天| 亚洲操人| 色综合九九| 丁香婷婷五月色成人网站| www.五月婷婷.com| 婷婷狠狠97| 久久99久久久| 久久伊人日日夜夜| 久久九九综合| 色婷婷XXXXX| 五月婷婷九九热| 青草五月天| PORNY九色9l自拍视频成人| 色色色色色色色色色影院| 五月天婷婷丁香成人网| 五月丁香综合影院| 丁香五月色五月婷婷宗合| 天天色播| 久久的爱大香蕉| 风流少妇A片一区二区蜜桃| 丁香五月综合婷婷| 九九热在线视频观看| 日日撸天天干| 五月丁香手机在线| 六月撸婷婷| 俺去婷婷 丁香| 国产精品久久久久久久久久| 婷婷丁香熟妇综合网| 久热免费| 欧洲免费视频色| 26uuu.| 91色噜噜狠狠狠狠色综合| 大香蕉天堂色| 一级AV片| 狠狠穞A片一區二區三區| 人妻视频在线| 五月丁香在线看| 99色热视频| 婷婷五月成人色综合| 99热青青草| 婷婷综合色网| 狠狠综合久久综合| www,99热在线观看| 日韩国产在线精品| 操碰97| 色五月激情| 久热中文字幕| 丁香五月社区| 色爱五月天| 婷婷综合六| 色婷婷五月天激情综合| 秋霞黄色一级久久| 色噜噜狠狠色综合日日| 色婷婷国产精品综合在线观看| 色欲操| 精品久热| 99在线69| 天天肏在线观看| 黑人无码一区| 91传媒无码人妻精| www.金莲av| 激情小说色五月| 成人做爰高潮A片免费视频| 婷婷丁香五月综合| 深爱激情五月网| 五月婷婷无码| 五月天综合婷婷| 六月丁香婷| 91操人| 激情久久久久久久久久久| 99热国产免费| 久色视频| 99综合| 五月婷婷成人| 大香蕉天堂| 日韩另类| 久久久97| 少妇被下春药玩弄A片| 欧美S码亚洲码精品M码| 另类少妇人与禽zOZZ0性伦| 成人综合网站| 九月丁香久久网| 婷婷激情六月中文| 香蕉五月婷婷| 婷婷激情五月天小说| 99色性爰网络| 先锋资源91| 亚韩在线视频| 五月婷婷啪啪| 亚洲无AV在线中文字幕| 9国产在线视频| 激情亚洲五月| 亚洲AV电影美洲AV电影| 91porn一起草| 操操日韩| 99碰| 九九aV| 99噜噜噜在线播放| 伊人网欧美在线男人天堂五月丁香| 久久婷婷网址| 中文字幕成人版| www.99热精品99.com| 四色五月视频| www99在线观看视频| www.久久| 精品网站99| 久久这里只有精品无码| 丁香五月精品| 国产美女视频久| 婷婷五月天堂| 99久久婷婷国产综合精品草原| 大香蕉婷婷五月天| 99热精品在线| 内射 无码 伊人| 黄色91在线观看| 午夜成人AV在线| 深爱丁香网| 丁香五月狠狠综合欧美| 丁香涩涩爱| 99re这里只有精品99| 99精品这里只有免费视频| 国产精品国产VA片国产| 噜噜五月天综合| 五月丁香亭亭操逼| 婷婷五月天视频| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 狠狠干综合| 九九人人操| 超碰丁香五月| 亚洲人人96@| 色五月天综合网| 99久久99九九99九九九| 青青999| 久色网址| 99热成人在线| 狠狠综合网| 色碰97| 天天色月| AV性爱在线| 99热9| 精品99在线| 五月激情网络| 国内外色色色色色成人视频| 九九99一区| 九九aV| 91se在线观看| 思思热性操| 婷婷丁香六月| 五月婷婷激情日本| 操啊操av| 丁香六月婷婷综合| 婷婷狠狠操| 性天天中文网| 可以看的av| 婷婷情色五月天| 欧美爆乳一区二区三区| 亚洲乱码精品久久久久.. | 91热99| 色色综合网。| 亚洲五月天伊人| 五月婷婷影院| 欧美亚洲成人在线| 婷婷涩五月天综合| 婷婷色色网| 丁香大香蕉| 九月av| 六月婷在线| 99思思热只有在这里看| 久久久国产精品黄毛片| www99热| 色婷婷五月天成人网| 五月色情婷婷| 天天影视色综合网| www.色五月| 五月天伊人av| 婷婷99狠狠躁天天躁| 色欲五月婷婷| 91人碰| 老妇操B| 开心激情五月天网| 综合精品啪啪| 中文在线视频久1| 激情五月婷婷综合秋霞| 色婷婷五月天天天天天天天天天| 五月婷激情| AV网在线观看| 五月婷六月婷婷| 99干免费视频| 综合激情深爱| 婷婷婷婷午夜| 五月天激情婷婷小说| 日韩免费视频| 婷婷五月天综合蜜桃| 色欲天天综合网| 五月天婷婷六月激情网| 婷婷丁香五月天激情| 国产xxxxx在线观看| 色色色热| 丁香婷婷久久激情| 亚洲视频在线观看| 婷婷五月天视频在线观看| 男女啪啪做爰高潮无遮挡| 五月丁香婷婷啪啪综合网| 色五月婷婷在线观看第一页舔| 丁香五月天激情| 中文av网站| WWW、日本色丁香co m| 国产欧美熟妇另类久久久| 色五月天中文字幕| 熟女强人妻一区二区三区四区无| 欧亚色色| 久久精品99国产精品日本| 无码激情精品色婷婷久久久久| 婷婷丁香五月激情| 狠狠草婷婷| 热久免费视频9| 激情综合一| 色色色99| 日本精品久久久久中文字幕| 亭亭色天香| 九九视频在线观看视频在线播放69| 97干婷婷五月天| 99碰碰碰| 亚洲天堂爱爱| 99这里只有精品国产| 伊人婷婷大香蕉在线| 人人干人人操人人摸| 97人人做| 香蕉97碰碰碰欧美| AVDV久久| 超碰三级秋霞| 五月丁香婷婷欧美色图视频五月丁香777电影| 开心五月激情网| 欧美成人精品A片免费一区99| 激情久久四色| 亚洲天堂婷婷| 色婷五月| 九九久久五月天综合伊人| 色99www.| 五月激情小说| 开心五月婷婷婷美女| 操操操操操操婷婷五月天| 国产熟妇乱子伦hd| 丁香 久久| 激情五月综亚网| 色www.con| 99视频| 激情爱爱网站| 可以直接看的av网站| 九九综舍久久| 青柠影视免费高清电视剧| 亚洲激情另类| 97干婷婷五月天| 99在线精品视频| 亚洲综合网在线| 久久停停超碰| 99热这里只有精品无码| 99久久综合| 丁香五月天亚洲综合| 色噜噜狠狠色综无码久久合欧美| 精品国产va久久久久| 热婷婷av| 天天爱天天操| 五月天丁香综合| 五月天色婷婷基地| 26UUU一区二区| 97超级操操| 性生生活大片又黄又| 大香蕉啪啪网| 99热这里只有精品5| 丁香色播五月天| 色婷婷综合网站| 91在线操| 任你弄在线视频免费| 日本三级日本三级99| 天天干天天做| 亚洲成人噜噜| 五月婷婷成人w| 国产婷婷色五月| 久久久久网站| 精品导航在线x不卡| 日韩成人无码| 欧美性爱五月天| 日本一级一片免费视频| 99热这里只有精品搜| 五月天婷婷丁香蜜桃91| ay2区| 色爱综合网| 亚洲有码在线视频| 影院久久久| 97luluse| 伊人婷婷福利网| 婷婷激情人妻| 一本久道综合色婷婷五月| 五月丁香婷婷网网网网| 日韩少妇内射免费播放| 婷婷亚洲色| 欧美 日韩 成人| 99色天堂| 激情五月网站| 一级韩国产精品毛| 亚洲情色一区| 七七九九色色| 丁香九月色| 五月天综合激情网| 激情五月图| 免费在线观看av网站| 青青草性爱视频| 不卡在线超碰| 天天日天天摸| 久久ww| 欧美特大片黄| www.婷婷六月天| 看婷婷五月天网| 色五月婷婷777| 荷兰av一级| 26uuu国产色| 婷婷五月综合免费在线| 97碰碰在线看视频免费| 超碰色婷婷| 五月久熟女| 色99视频| 日日天天天| 激情开心五月婷婷| 五月婷婷熟女| 国产资源91在线| 色婷婷视频在线| 麻豆雪千夏| 色婷视频| 五月丁香大香蕉| 人与禽A片啪啪| 9色天堂| 亚洲99在线| 亚洲AV成人在线| 五月丁香怕怕综合| 日韩av干| 五月丁香五月婷婷在线观看| 少妇搡BBBB搡BBB搡毛茸茸 | 亚洲精品视频在线| 国产偷人爽久久久久久老妇APP| 大香网伊人久久综合| 丁香五月天社区| 国产乱妇乱子在线播视频播放网站| 亚洲热热视频| 香蕉人妻AV久久久久天天| 大香蕉丁香五月| 99色在线观看视频| 99爱视频精品在线观看| 五月婷婷co.m| 亚洲婷婷免费| 色婷婷亚洲婷婷| 秋霞免费视频| 99在线综合视频| 天天搡日日搡aaaaⅩ| 色色色视频| 色欲色香综合网| 亚洲视频99| 丁香五月天大香蕉啪啪| 97婷婷在线| 久热这里这里有精品| 婷婷五月激情天| 色综合久久久久| 日韩AV中文在线观看| 91婷婷五月丁香碰| 人人色婷婷五月天| 99re这里| 色色网站| www99精品亚| 激情丁香婷婷六月天| 五月丁香婷婷潮喷中文字幕| 91狠狠综合久久| 五月丁香色欲| 少妇高潮一区二区三区99欧美| 久久免费精品小视频| 五月丁香六月婷婷手机无线| 97色97干| 91无码一起草| 婷婷月五天在线在线看| 亚洲成人噜噜| 日本色婷婷| 另类视屏| 丁香婷婷六月激情综合| 99久久综合精品五月天| 天天色天天爽| 看片视频在线免费日产在线看| 婷婷五月天伊人| 国产午夜精品一区二区三区嫩草| www.丁香六月婷婷久久天堂影院.con| 香蕉婷婷五月| 97成人丁香婷婷| 五月婷婷激情综合av| 成熟妇人A片免费看网站| 久久婷婷网站| 婷婷五月天狠狠搞干| 最近中文字幕大全免费版在线| WwW色婷婷| 大香蕉婷婷| 五月丁香激情综合久久| 丁香五月激情久久麻豆| 五月天激情综合网俺也去| 色色AV色色色东莞| www.丁香六月婷婷久久天堂影院.con| 日本情色一区二区| 激情五月亚洲综合网| 久热9| 丁香五月人妻| 思思热久热| 91人久| 婷婷色播色五月五色五月天色妇| 久久99成人性爱高清视频| 99ri精品| 国产91视频| 五月天婷婷免费视频| 婷婷94s| 5月婷婷激情6月| 丁香五月天社区| 成人短视频在线| 婷婷五月天天爽| a毛片二逼wwwwwwwwww| 五月天中文字幕在线婷婷| 99色在线观看| 五月婷丁香花| 99色综合| 亚洲av网站| 日韩在线视频中文字幕| 熟女啪啪视频| 六月色播| 久久久久久18| 天天天操天天天日| 久久久久久久久久久jjjj| 甈你aaaaa| 激情九月婷婷九月| 先锋av性爱成人电影| 精品亚洲国产成AV人片传媒| 婷婷欧美色| 91蜜桃婷婷狠狠久久综合9色| 丁香五月天狠狠操| 97欧美在线| 五月丁香欧美综合| 九九色精品|