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

ARTICLE DETAIL

資訊詳情

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

Linux下CMake生成與鏈接庫(kù):靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)實(shí)戰(zhàn)指南

Linux下CMake生成與鏈接庫(kù):靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)實(shí)戰(zhàn)指南 1. 從一個(gè)真實(shí)場(chǎng)景說(shuō)起為什么你需要搞懂CMake的庫(kù)生成與鏈接如果你寫(xiě)過(guò)C或者C大概率經(jīng)歷過(guò)這樣的階段一開(kāi)始所有代碼都塞進(jìn)一個(gè)main.c或者main.cpp里編譯命令就是一行g(shù)cc main.c -o app簡(jiǎn)單粗暴能跑就行。但項(xiàng)目稍微大一點(diǎn)代碼量上來(lái)了你就會(huì)開(kāi)始琢磨是不是該把一些通用的功能抽出來(lái)單獨(dú)編譯成一個(gè)庫(kù)這樣既能復(fù)用又能讓主程序的編譯速度變快還能把接口和實(shí)現(xiàn)分離別人用你的庫(kù)時(shí)只需要頭文件和二進(jìn)制文件不用關(guān)心內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。這個(gè)思路是對(duì)的但問(wèn)題也隨之而來(lái)庫(kù)怎么生成生成之后怎么讓主程序找到它、鏈接它在Linux環(huán)境下CMake是目前最主流的構(gòu)建工具之一它跨平臺(tái)、語(yǔ)法相對(duì)清晰、社區(qū)生態(tài)好。但很多人在第一次用CMake生成庫(kù)并鏈接庫(kù)的時(shí)候都會(huì)踩一堆坑undefined reference、cannot find -lxxx、運(yùn)行時(shí)error while loading shared libraries……這些報(bào)錯(cuò)信息看著就頭疼。我自己在帶新人的時(shí)候發(fā)現(xiàn)大家最容易卡住的地方不是寫(xiě)代碼而是構(gòu)建系統(tǒng)。代碼邏輯明明沒(méi)問(wèn)題但就是編譯不過(guò)、鏈接不上。所以這篇文章我想把Linux下用CMake生成庫(kù)、鏈接庫(kù)這件事從頭到尾講清楚。不管你是剛接觸CMake的新手還是已經(jīng)用過(guò)但總是靠復(fù)制粘貼配置的老手我都盡量把每個(gè)參數(shù)、每個(gè)步驟背后的“為什么”說(shuō)明白。文章會(huì)覆蓋靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的生成方式、鏈接時(shí)的路徑處理、運(yùn)行時(shí)動(dòng)態(tài)庫(kù)查找、常見(jiàn)報(bào)錯(cuò)排查以及一些我在實(shí)際項(xiàng)目中總結(jié)出來(lái)的經(jīng)驗(yàn)技巧。你可以把它當(dāng)成一份可以隨時(shí)翻出來(lái)對(duì)照的操作手冊(cè)。2. 先搞清楚基礎(chǔ)概念靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)到底有什么區(qū)別在動(dòng)手寫(xiě)CMake配置之前有必要先把靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)這兩個(gè)概念理清楚。很多人配置寫(xiě)不對(duì)根本原因是對(duì)這兩種庫(kù)的鏈接機(jī)制理解模糊。2.1 靜態(tài)庫(kù)的工作方式與適用場(chǎng)景靜態(tài)庫(kù)在Linux下通常以.a結(jié)尾全稱(chēng)是archive本質(zhì)上就是一堆.o目標(biāo)文件的打包集合。當(dāng)你把主程序和靜態(tài)庫(kù)鏈接時(shí)鏈接器會(huì)把靜態(tài)庫(kù)中用到的目標(biāo)文件直接復(fù)制到最終的可執(zhí)行文件里。這意味著最終的可執(zhí)行文件體積會(huì)變大但好處是它不依賴(lài)外部庫(kù)文件拿到哪里都能跑。靜態(tài)庫(kù)的生成過(guò)程分兩步先把源文件編譯成目標(biāo)文件.o然后用ar命令打包。在CMake里你只需要用add_library命令并指定STATIC類(lèi)型CMake會(huì)自動(dòng)幫你完成這兩步。靜態(tài)庫(kù)適合什么場(chǎng)景我個(gè)人的經(jīng)驗(yàn)是小工具、嵌入式環(huán)境、需要單文件分發(fā)的場(chǎng)景以及你不想讓用戶(hù)操心動(dòng)態(tài)庫(kù)路徑的情況。缺點(diǎn)是如果多個(gè)程序都鏈接了同一個(gè)靜態(tài)庫(kù)每個(gè)程序都會(huì)有一份庫(kù)代碼的副本內(nèi)存和磁盤(pán)占用會(huì)重復(fù)。2.2 動(dòng)態(tài)庫(kù)的工作方式與適用場(chǎng)景動(dòng)態(tài)庫(kù)在Linux下以.so結(jié)尾全稱(chēng)是shared object。它和靜態(tài)庫(kù)最大的區(qū)別在于鏈接階段只是記錄了對(duì)動(dòng)態(tài)庫(kù)的引用真正的代碼加載發(fā)生在程序啟動(dòng)時(shí)或者運(yùn)行時(shí)通過(guò)dlopen手動(dòng)加載。多個(gè)程序可以共享同一個(gè)動(dòng)態(tài)庫(kù)的內(nèi)存映射節(jié)省系統(tǒng)資源。動(dòng)態(tài)庫(kù)的生成需要編譯時(shí)加上-fPIC選項(xiàng)也就是位置無(wú)關(guān)代碼。這是因?yàn)閯?dòng)態(tài)庫(kù)被加載到內(nèi)存的地址是不確定的代碼必須能在任意地址執(zhí)行。CMake里用add_library指定SHARED類(lèi)型時(shí)會(huì)自動(dòng)幫你加上-fPIC。動(dòng)態(tài)庫(kù)的優(yōu)點(diǎn)是節(jié)省資源、方便更新替換.so文件即可不用重新編譯主程序缺點(diǎn)是部署時(shí)需要考慮庫(kù)的查找路徑問(wèn)題否則程序啟動(dòng)時(shí)會(huì)報(bào)找不到庫(kù)。2.3 兩種庫(kù)的對(duì)比與選型建議對(duì)比維度靜態(tài)庫(kù).a動(dòng)態(tài)庫(kù).so鏈接時(shí)機(jī)編譯鏈接時(shí)復(fù)制代碼運(yùn)行時(shí)加載可執(zhí)行文件體積較大較小部署依賴(lài)無(wú)外部依賴(lài)需要庫(kù)文件存在更新方式需重新編譯主程序替換庫(kù)文件即可內(nèi)存占用每個(gè)程序獨(dú)立副本多程序共享編譯選項(xiàng)無(wú)特殊要求需要-fPIC適用場(chǎng)景小工具、嵌入式、單文件分發(fā)大型項(xiàng)目、多程序共享、插件架構(gòu)選型的時(shí)候我一般遵循這樣的原則如果是公司內(nèi)部的基礎(chǔ)組件多個(gè)項(xiàng)目都會(huì)用那就做成動(dòng)態(tài)庫(kù)方便統(tǒng)一升級(jí)如果是給外部交付的單文件工具那就靜態(tài)鏈接省得用戶(hù)配環(huán)境如果項(xiàng)目對(duì)啟動(dòng)速度有極致要求靜態(tài)庫(kù)會(huì)略快一點(diǎn)點(diǎn)因?yàn)槭∪チ藙?dòng)態(tài)鏈接的過(guò)程。3. CMake生成庫(kù)的核心命令與參數(shù)詳解理解了靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別之后我們來(lái)看CMake里具體怎么操作。這一部分我會(huì)把每個(gè)關(guān)鍵命令拆開(kāi)講包括參數(shù)的含義和我自己在使用中總結(jié)的注意事項(xiàng)。3.1 add_library命令的完整用法add_library是CMake生成庫(kù)的核心命令基本語(yǔ)法是add_library(庫(kù)名稱(chēng) [STATIC | SHARED | MODULE] [源文件...])庫(kù)名稱(chēng)不需要加lib前綴和.a/.so后綴CMake會(huì)自動(dòng)處理。比如你寫(xiě)add_library(mymath STATIC math.cpp)最終生成的文件是libmymath.a。STATIC和SHARED分別對(duì)應(yīng)靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。如果不指定類(lèi)型CMake會(huì)根據(jù)BUILD_SHARED_LIBS變量的值來(lái)決定默認(rèn)是STATIC。我建議在項(xiàng)目里顯式指定類(lèi)型避免因?yàn)榄h(huán)境變量不同導(dǎo)致構(gòu)建結(jié)果不一致。MODULE類(lèi)型比較特殊它生成的是不會(huì)被自動(dòng)鏈接的動(dòng)態(tài)庫(kù)通常用于插件場(chǎng)景需要配合dlopen手動(dòng)加載。一般項(xiàng)目里用得少但如果你要做插件架構(gòu)就會(huì)用到它。還有一個(gè)細(xì)節(jié)源文件列表可以寫(xiě)多個(gè)文件也可以用變量代替。比如set(MYMATH_SOURCES math.cpp advanced_math.cpp) add_library(mymath STATIC ${MYMATH_SOURCES})這樣寫(xiě)的好處是源文件列表集中管理后續(xù)增刪文件不容易漏改。3.2 頭文件路徑與安裝規(guī)則的配置生成庫(kù)的時(shí)候通常需要指定頭文件路徑讓編譯器能找到你的.h文件。用target_include_directories命令target_include_directories(mymath PUBLIC $BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include $INSTALL_INTERFACE:include )這里PUBLIC的意思是這個(gè)包含路徑既用于編譯庫(kù)本身也會(huì)傳遞給鏈接這個(gè)庫(kù)的目標(biāo)。BUILD_INTERFACE和INSTALL_INTERFACE是生成器表達(dá)式分別指定構(gòu)建時(shí)和安裝后的路徑。這樣寫(xiě)的好處是當(dāng)你的庫(kù)被安裝到系統(tǒng)目錄后其他項(xiàng)目通過(guò)find_package找到它時(shí)能自動(dòng)獲得正確的頭文件路徑。安裝規(guī)則用install命令install(TARGETS mymath ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin ) install(DIRECTORY include/ DESTINATION include)ARCHIVE對(duì)應(yīng)靜態(tài)庫(kù)LIBRARY對(duì)應(yīng)動(dòng)態(tài)庫(kù)RUNTIME對(duì)應(yīng)可執(zhí)行文件Windows下的DLL也會(huì)放到RUNTIME。這樣配置之后執(zhí)行make install就會(huì)把庫(kù)文件和頭文件分別放到lib和include目錄下。3.3 版本號(hào)與SONAME的配置要點(diǎn)動(dòng)態(tài)庫(kù)有一個(gè)很重要的概念叫SONAMEShared Object Name它決定了程序運(yùn)行時(shí)查找的是哪個(gè)版本的庫(kù)。在CMake里通過(guò)set_target_properties配置set_target_properties(mymath PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} )假設(shè)版本號(hào)是1.2.3SOVERSION是1那么生成的文件會(huì)有三個(gè)libmymath.so.1.2.3實(shí)際文件、libmymath.so.1SONAME軟鏈接、libmymath.so開(kāi)發(fā)用軟鏈接。程序鏈接時(shí)記錄的是SONAME也就是libmymath.so.1運(yùn)行時(shí)加載器會(huì)去找這個(gè)文件。這樣做的好處是當(dāng)你升級(jí)到1.3.0時(shí)SONAME還是libmymath.so.1舊程序不用重新編譯就能用新庫(kù)如果升級(jí)到2.0.0SOVERSION變成2舊程序仍然找libmymath.so.1不會(huì)因?yàn)榻涌诓患嫒荻罎ⅰW⒁馊绻悴辉O(shè)置SOVERSIONCMake默認(rèn)不會(huì)生成SONAME軟鏈接程序鏈接時(shí)記錄的就是完整路徑或者libmymath.so這會(huì)給后續(xù)升級(jí)帶來(lái)麻煩。所以只要做動(dòng)態(tài)庫(kù)就一定要配VERSION和SOVERSION。4. 鏈接庫(kù)的完整實(shí)操流程與參數(shù)計(jì)算庫(kù)生成好了接下來(lái)就是怎么讓主程序鏈接它。這一部分我按照從簡(jiǎn)單到復(fù)雜的順序把鏈接方式分成幾種情況來(lái)講每種情況都給出完整的CMake配置和操作步驟。4.1 同一項(xiàng)目?jī)?nèi)鏈接target_link_libraries的基本用法如果庫(kù)和主程序在同一個(gè)CMake項(xiàng)目里鏈接非常簡(jiǎn)單add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE mymath)PRIVATE表示這個(gè)鏈接關(guān)系只用于編譯myapp本身不會(huì)傳遞給其他依賴(lài)myapp的目標(biāo)。如果是庫(kù)依賴(lài)庫(kù)的情況比如mymath依賴(lài)mylog那mymath鏈接mylog時(shí)應(yīng)該用PRIVATE還是PUBLIC這取決于mymath的頭文件里是否暴露了mylog的類(lèi)型。如果mymath.h里包含了mylog.h那就必須用PUBLIC否則鏈接mymath的程序會(huì)因?yàn)檎也坏絤ylog的符號(hào)而報(bào)錯(cuò)。如果mylog只在mymath.cpp里用那就用PRIVATE避免不必要的依賴(lài)傳遞。這個(gè)PRIVATE/PUBLIC/INTERFACE的區(qū)分是CMake現(xiàn)代用法里很重要的部分用好了能讓依賴(lài)關(guān)系清晰編譯速度也會(huì)更快。4.2 鏈接外部庫(kù)find_library與link_directories的取舍當(dāng)庫(kù)不在同一個(gè)項(xiàng)目里而是已經(jīng)安裝在系統(tǒng)的某個(gè)位置就需要告訴CMake去哪里找。有兩種方式第一種是用find_libraryfind_library(MYMATH_LIB NAMES mymath PATHS /opt/mymath/lib) if(NOT MYMATH_LIB) message(FATAL_ERROR mymath library not found) endif() target_link_libraries(myapp PRIVATE ${MYMATH_LIB})第二種是用link_directories加target_link_librarieslink_directories(/opt/mymath/lib) target_link_libraries(myapp PRIVATE mymath)我強(qiáng)烈建議用第一種方式。link_directories是全局生效的會(huì)影響之后所有目標(biāo)的鏈接路徑容易造成污染和意外鏈接到錯(cuò)誤版本的庫(kù)。find_library是精確查找找到之后把完整路徑傳給target_link_libraries依賴(lài)關(guān)系明確排查問(wèn)題也方便。如果庫(kù)有對(duì)應(yīng)的CMake配置文件比如mymathConfig.cmake那更好的方式是用find_packagefind_package(mymath REQUIRED) target_link_libraries(myapp PRIVATE mymath::mymath)這種方式能自動(dòng)處理頭文件路徑、庫(kù)路徑、依賴(lài)關(guān)系是最推薦的做法。但前提是庫(kù)的開(kāi)發(fā)者提供了配置文件這個(gè)我們后面會(huì)講怎么生成。4.3 運(yùn)行時(shí)動(dòng)態(tài)庫(kù)查找RPATH與LD_LIBRARY_PATH的處理動(dòng)態(tài)庫(kù)鏈接成功之后編譯不會(huì)報(bào)錯(cuò)但運(yùn)行的時(shí)候可能會(huì)遇到error while loading shared libraries: libmymath.so.1: cannot open shared object file這是因?yàn)閯?dòng)態(tài)鏈接器在運(yùn)行時(shí)找不到庫(kù)文件。默認(rèn)情況下動(dòng)態(tài)鏈接器會(huì)搜索/lib、/usr/lib這些系統(tǒng)目錄以及LD_LIBRARY_PATH環(huán)境變量指定的目錄。如果你的庫(kù)安裝在/opt/mymath/lib那就不在默認(rèn)搜索路徑里。解決辦法有幾種第一種是設(shè)置LD_LIBRARY_PATHexport LD_LIBRARY_PATH/opt/mymath/lib:$LD_LIBRARY_PATH ./myapp這種方式簡(jiǎn)單但每次運(yùn)行都要設(shè)置而且如果多個(gè)項(xiàng)目依賴(lài)不同版本的庫(kù)容易沖突。第二種是在CMake里設(shè)置RPATHset_target_properties(myapp PROPERTIES BUILD_RPATH /opt/mymath/lib INSTALL_RPATH /opt/mymath/lib )RPATH會(huì)被寫(xiě)入可執(zhí)行文件運(yùn)行時(shí)動(dòng)態(tài)鏈接器會(huì)優(yōu)先從RPATH指定的目錄查找。BUILD_RPATH用于構(gòu)建時(shí)INSTALL_RPATH用于安裝后。這種方式比LD_LIBRARY_PATH更可靠因?yàn)樗菍?xiě)死在二進(jìn)制文件里的不受環(huán)境變量影響。第三種是把庫(kù)安裝到系統(tǒng)默認(rèn)搜索路徑比如/usr/local/lib然后運(yùn)行l(wèi)dconfig更新緩存。這種方式適合系統(tǒng)級(jí)安裝但需要root權(quán)限而且可能影響其他程序。我一般推薦用RPATH的方式特別是項(xiàng)目部署到多臺(tái)機(jī)器時(shí)RPATH能保證程序在任何環(huán)境下都能找到正確的庫(kù)。4.4 參數(shù)計(jì)算實(shí)例從編譯命令反推CMake配置有時(shí)候我們需要從手寫(xiě)的編譯命令反推CMake配置或者反過(guò)來(lái)驗(yàn)證CMake生成的命令是否正確。舉個(gè)例子假設(shè)手寫(xiě)編譯命令是這樣的gcc main.c -o app -I/opt/mymath/include -L/opt/mymath/lib -lmymath -Wl,-rpath,/opt/mymath/lib對(duì)應(yīng)的CMake配置就是find_library(MYMATH_LIB NAMES mymath PATHS /opt/mymath/lib) target_include_directories(myapp PRIVATE /opt/mymath/include) target_link_libraries(myapp PRIVATE ${MYMATH_LIB}) set_target_properties(myapp PROPERTIES INSTALL_RPATH /opt/mymath/lib)你可以用make VERBOSE1來(lái)查看CMake實(shí)際執(zhí)行的編譯和鏈接命令對(duì)比一下就能確認(rèn)配置是否正確。這個(gè)技巧在排查鏈接問(wèn)題時(shí)非常有用。5. 常見(jiàn)報(bào)錯(cuò)與排查技巧實(shí)錄這一部分是我在實(shí)際項(xiàng)目里踩過(guò)的坑和總結(jié)出來(lái)的排查方法。鏈接問(wèn)題往往報(bào)錯(cuò)信息很模糊但只要掌握套路定位起來(lái)并不難。5.1 undefined reference符號(hào)找不到的幾種原因undefined reference to xxx是最常見(jiàn)的鏈接錯(cuò)誤。原因通常有這幾種第一種是庫(kù)沒(méi)有鏈接上。檢查target_link_libraries里是否包含了對(duì)應(yīng)的庫(kù)庫(kù)名拼寫(xiě)是否正確。注意CMake里寫(xiě)的是mymath不是libmymath.a。第二種是鏈接順序問(wèn)題。在Linux下鏈接器從左到右處理庫(kù)如果庫(kù)A依賴(lài)庫(kù)B那A必須寫(xiě)在B前面。CMake的target_link_libraries會(huì)自動(dòng)處理依賴(lài)順序但如果你手動(dòng)用-l參數(shù)就要注意順序。第三種是C和C混合編譯時(shí)的extern C問(wèn)題。C編譯器會(huì)對(duì)函數(shù)名進(jìn)行name mangling如果C代碼調(diào)用C庫(kù)的函數(shù)或者反過(guò)來(lái)就需要用extern C包裹聲明。這個(gè)坑在混合編程時(shí)非常常見(jiàn)。第四種是庫(kù)的ABI不兼容。比如用不同版本的編譯器編譯的庫(kù)或者C標(biāo)準(zhǔn)庫(kù)版本不一致都可能導(dǎo)致符號(hào)找不到。這種情況比較隱蔽需要檢查編譯器和標(biāo)準(zhǔn)庫(kù)版本。5.2 cannot find -lxxx庫(kù)路徑配置錯(cuò)誤的排查cannot find -lmymath表示鏈接器在搜索路徑里找不到libmymath.so或libmymath.a。排查步驟先確認(rèn)庫(kù)文件確實(shí)存在用ls看一下路徑對(duì)不對(duì)。然后確認(rèn)target_link_libraries里寫(xiě)的庫(kù)名和實(shí)際文件名是否匹配。如果庫(kù)文件是libmymath.a那CMake里寫(xiě)mymath就對(duì)了。如果庫(kù)文件是libmymath_core.a那就要寫(xiě)mymath_core。再確認(rèn)搜索路徑是否包含庫(kù)所在目錄。用find_library的話(huà)檢查PATHS參數(shù)是否正確用link_directories的話(huà)檢查路徑是否拼寫(xiě)錯(cuò)誤??梢栽贑Make里加message(STATUS MYMATH_LIB${MYMATH_LIB})來(lái)打印查找結(jié)果。還有一個(gè)容易忽略的點(diǎn)32位和64位庫(kù)混用。如果你的系統(tǒng)是64位但庫(kù)是32位編譯的鏈接時(shí)會(huì)報(bào)找不到。用file libmymath.a可以查看庫(kù)的架構(gòu)信息。5.3 運(yùn)行時(shí)找不到動(dòng)態(tài)庫(kù)三種解決方案對(duì)比前面提到了error while loading shared libraries的問(wèn)題這里把三種解決方案做個(gè)對(duì)比方案優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景LD_LIBRARY_PATH配置簡(jiǎn)單立即生效環(huán)境變量污染多版本沖突臨時(shí)調(diào)試RPATH寫(xiě)入二進(jìn)制不受環(huán)境影響路徑寫(xiě)死遷移需重新編譯固定部署路徑ldconfig系統(tǒng)級(jí)生效所有程序可用需要root權(quán)限影響全局系統(tǒng)級(jí)安裝我個(gè)人的習(xí)慣是開(kāi)發(fā)階段用LD_LIBRARY_PATH快速驗(yàn)證部署階段用RPATH保證可靠性如果是給系統(tǒng)安裝庫(kù)那就用ldconfig。5.4 常見(jiàn)問(wèn)題速查表報(bào)錯(cuò)信息可能原因排查方法解決方案undefined reference庫(kù)未鏈接/順序錯(cuò)誤/extern C缺失檢查target_link_libraries和頭文件聲明補(bǔ)鏈接、調(diào)整順序、加extern Ccannot find -lxxx庫(kù)路徑不對(duì)/庫(kù)名拼寫(xiě)錯(cuò)誤用find_library打印結(jié)果修正路徑或庫(kù)名error while loading shared libraries運(yùn)行時(shí)找不到.so用ldd查看依賴(lài)設(shè)置RPATH或LD_LIBRARY_PATHversion GLIBCXX_xxx not foundC標(biāo)準(zhǔn)庫(kù)版本不匹配檢查編譯器和標(biāo)準(zhǔn)庫(kù)版本統(tǒng)一編譯環(huán)境或靜態(tài)鏈接標(biāo)準(zhǔn)庫(kù)cannot open shared object file庫(kù)文件不存在或權(quán)限不足ls檢查文件檢查權(quán)限安裝庫(kù)文件或修改權(quán)限提示遇到鏈接問(wèn)題時(shí)先用ldd查看可執(zhí)行文件的依賴(lài)關(guān)系再用nm查看庫(kù)里的符號(hào)最后用make VERBOSE1查看實(shí)際編譯命令。這三板斧能解決大部分問(wèn)題。6. 進(jìn)階技巧讓庫(kù)更專(zhuān)業(yè)、更好用基礎(chǔ)操作掌握之后這一部分分享一些進(jìn)階技巧讓你的庫(kù)更容易被其他項(xiàng)目集成也更符合工程規(guī)范。6.1 生成CMake配置文件讓find_package開(kāi)箱即用如果你希望別人用find_package(mymath)就能找到你的庫(kù)需要生成兩個(gè)文件mymathConfig.cmake和mymathConfigVersion.cmake。CMake提供了configure_package_config_file和write_basic_package_version_file兩個(gè)宏來(lái)簡(jiǎn)化這個(gè)過(guò)程。include(CMakePackageConfigHelpers) configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/mymathConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/mymathConfig.cmake INSTALL_DESTINATION lib/cmake/mymath ) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/mymathConfigVersion.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mymathConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/mymathConfigVersion.cmake DESTINATION lib/cmake/mymath )mymathConfig.cmake.in的內(nèi)容大概是PACKAGE_INIT include(${CMAKE_CURRENT_LIST_DIR}/mymathTargets.cmake)然后導(dǎo)出目標(biāo)install(TARGETS mymath EXPORT mymathTargets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin ) install(EXPORT mymathTargets FILE mymathTargets.cmake NAMESPACE mymath:: DESTINATION lib/cmake/mymath )這樣配置之后其他項(xiàng)目用find_package(mymath REQUIRED)就能找到你的庫(kù)然后用target_link_libraries(app PRIVATE mymath::mymath)鏈接頭文件路徑、庫(kù)路徑、依賴(lài)關(guān)系全部自動(dòng)處理。這是最專(zhuān)業(yè)的做法也是開(kāi)源庫(kù)的標(biāo)配。6.2 用Object Library減少重復(fù)編譯如果你的庫(kù)有多個(gè)目標(biāo)共享同一批源文件可以用Object Library來(lái)避免重復(fù)編譯add_library(mymath_obj OBJECT math.cpp advanced_math.cpp) target_include_directories(mymath_obj PUBLIC include) add_library(mymath_static STATIC $TARGET_OBJECTS:mymath_obj) add_library(mymath_shared SHARED $TARGET_OBJECTS:mymath_obj)這樣math.cpp和advanced_math.cpp只編譯一次生成的目標(biāo)文件同時(shí)用于靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)編譯時(shí)間能省不少。這個(gè)技巧在大型項(xiàng)目里特別有用。6.3 編譯選項(xiàng)的精細(xì)控制與調(diào)試符號(hào)生成庫(kù)的時(shí)候編譯選項(xiàng)的控制也很重要。比如調(diào)試版本需要加-g發(fā)布版本需要加-O2這些可以通過(guò)target_compile_options來(lái)配置target_compile_options(mymath PRIVATE $$CONFIG:Debug:-g -O0 $$CONFIG:Release:-O2 -DNDEBUG )$CONFIG:Debug是生成器表達(dá)式根據(jù)構(gòu)建類(lèi)型選擇不同的選項(xiàng)。這樣一套配置就能同時(shí)支持Debug和Release構(gòu)建不用手動(dòng)改CMakeLists。另外動(dòng)態(tài)庫(kù)默認(rèn)會(huì)導(dǎo)出所有符號(hào)如果你只想導(dǎo)出指定的接口可以用-fvisibilityhidden配合__attribute__((visibility(default)))來(lái)控制。這樣能減小庫(kù)的體積也能避免符號(hào)沖突。6.4 跨平臺(tái)構(gòu)建的注意事項(xiàng)雖然這篇文章主要講Linux但CMake的優(yōu)勢(shì)就是跨平臺(tái)。如果你希望庫(kù)能在Windows和macOS上也能構(gòu)建需要注意幾點(diǎn)Windows下動(dòng)態(tài)庫(kù)需要顯式導(dǎo)出符號(hào)通常用__declspec(dllexport)和__declspec(dllimport)可以定義一個(gè)宏來(lái)統(tǒng)一處理if(WIN32) target_compile_definitions(mymath PRIVATE MYMATH_EXPORTS) endif()然后在頭文件里#ifdef _WIN32 #ifdef MYMATH_EXPORTS #define MYMATH_API __declspec(dllexport) #else #define MYMATH_API __declspec(dllimport) #endif #else #define MYMATH_API __attribute__((visibility(default))) #endifmacOS下動(dòng)態(tài)庫(kù)是.dylib安裝名稱(chēng)install_name需要用rpath來(lái)配置CMake的INSTALL_RPATH在macOS下也適用但語(yǔ)法略有不同。這些細(xì)節(jié)在跨平臺(tái)項(xiàng)目里都需要注意。7. 一個(gè)完整可復(fù)現(xiàn)的項(xiàng)目示例說(shuō)了這么多理論最后給一個(gè)完整的項(xiàng)目示例你可以直接復(fù)制到本地運(yùn)行驗(yàn)證整個(gè)流程。7.1 項(xiàng)目目錄結(jié)構(gòu)mymath_project/ ├── CMakeLists.txt ├── include/ │ └── mymath.h ├── src/ │ ├── math.cpp │ └── advanced_math.cpp └── app/ └── main.cpp7.2 庫(kù)的CMakeLists.txt配置cmake_minimum_required(VERSION 3.16) project(mymath VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(mymath SHARED src/math.cpp src/advanced_math.cpp ) target_include_directories(mymath PUBLIC $BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include $INSTALL_INTERFACE:include ) set_target_properties(mymath PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} ) install(TARGETS mymath LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin ) install(DIRECTORY include/ DESTINATION include)7.3 主程序的鏈接配置add_executable(myapp app/main.cpp) target_link_libraries(myapp PRIVATE mymath)7.4 編譯、安裝與運(yùn)行驗(yàn)證mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX/opt/mymath make make install # 運(yùn)行程序 /opt/mymath/bin/myapp如果運(yùn)行時(shí)提示找不到動(dòng)態(tài)庫(kù)檢查/opt/mymath/lib是否在RPATH里或者臨時(shí)設(shè)置LD_LIBRARY_PATH驗(yàn)證。7.5 用ldd和nm驗(yàn)證鏈接結(jié)果# 查看可執(zhí)行文件依賴(lài)的動(dòng)態(tài)庫(kù) ldd /opt/mymath/bin/myapp # 查看庫(kù)中導(dǎo)出的符號(hào) nm -D /opt/mymath/lib/libmymath.so # 查看庫(kù)的SONAME objdump -p /opt/mymath/lib/libmymath.so | grep SONAME這幾個(gè)命令能幫你確認(rèn)庫(kù)是否正確生成、程序是否正確鏈接、運(yùn)行時(shí)是否能找到庫(kù)。8. 個(gè)人經(jīng)驗(yàn)總結(jié)與后續(xù)擴(kuò)展方向我在實(shí)際項(xiàng)目里用CMake管理庫(kù)的生成和鏈接最大的體會(huì)是配置要顯式依賴(lài)要清晰路徑要可控。顯式指定庫(kù)類(lèi)型、顯式聲明依賴(lài)關(guān)系、顯式設(shè)置RPATH能避免很多“換個(gè)環(huán)境就編譯不過(guò)”的問(wèn)題。另外盡早引入find_package和配置文件導(dǎo)出機(jī)制雖然前期麻煩一點(diǎn)但項(xiàng)目變大之后會(huì)省很多事。后續(xù)如果你想繼續(xù)深入可以研究這幾個(gè)方向用CPack打包庫(kù)的安裝包用CTest做單元測(cè)試集成用Conan或vcpkg管理第三方依賴(lài)以及用CMake的FetchContent模塊自動(dòng)下載和構(gòu)建依賴(lài)庫(kù)。這些都是在實(shí)際工程中很實(shí)用的技能等基礎(chǔ)打牢之后可以逐步嘗試。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲字幕AV一区二区三区四区| www,天天干| 午夜性爱影视一区77| tingtingjiqingwuyue| 婷婷五月丁香基地在线视频官网| 五月婷婷内射网| 都市激情久久| 久久这里只有精品网| 色欲丁香久久| 日日日日操| 99国产在线| 亚洲最大激情无码| 欧美婷婷丁香五月社区| 色婷婷丁香五月| 亚洲激情久久| 久久性综合| 婷婷五月激情综合网| 色五月色情| 色播五月丁香综合| 五月丁香婷婷久久| 5月色亭亭视频| 五月丁香六月婷婷免费视频| 色七七色九九| 婷婷亚洲天堂| 日本不卡一区二区三区| 人人97操| 超碰在线国产| 天天操夜夜夜拍拍拍| 玖操97| 99热精品一| 狠狠色噜噜色狠狠狠综合久久成人波| 第二色AⅤ| 欧美精品久久久久久视频观看| 很操日本7| 亚州精品久久久久AV无码| 久久久精品色色色| 成人电影一区| 亚洲宗合激情| 久久新| 五月丁香A片| 欧美日韩AAAAA| 思思w99| 第四色五月天| 99操碰| 91干婷婷| 九色91国产| 欧美婷婷六月丁香综合色连续高潮抽搐| 色五月婷婷五月久久| 久久综合激情婷婷激情| 日韩操人| 淫视馆av三区| 久草天堂| 色色丁香激情五月| 丁香色婷婷| 202丰满熟女妇大| 婷婷五月天最新网址| 91互操| 六月婷婷五月丁香首页| 激情五月,激情综合网| 婷婷综合视频| 久久激情中文| www.91.com黄| 丁香五月天欧美在线| 久久六月综合| 久99| 99精品高潮| 丁香五月激情综合| 五月婷六月| 色婷婷丁香特级性爱视频| 五月天激情无码专区| 99热免费精品| 日韩AV在线影片| 99热高清在线| 丁香五月婷婷亚洲综合精品在线| 免费播放片大片| 色色国产| 狠狠色五月| ,99视频久久| 老司机伊人| 婷婷五月av| 激情五月五月五月婷婷| 九九99免费理论| 99热热热99精品婷婷| 91啪啪网| 五月婷丁香亚洲| 啪啪 综合网| 国产露脸150部国语对白| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 天天爽天天日| 思思9久久| 99日精品视频| 欧美在线视频99| 婷婷色五月色| 婷婷五月天狠狠色| 国产精品久久久久9999小说| 99激情视频| 婷婷五月天首页激情| 成人视频在线免费播放| 色婷婷色久综| 97人人射| 亭亭玉月丁香| 六月天六月婷| 天天爽天天操| 日韩超碰在线| 夜夜躁爽日| 色色99| 爱久综合| 日本天堂网站99| 丁香五月六月久久综合 | 99色婷婷| 色九九七七| 婷婷伊人激情婷婷| 天天色色天天| 台湾无码A片一区二区| 婷婷综合伊人丁香| 中文人妻AV久久人妻18| 成片免费观看视频大全| 色色日本欧美| 91干99| 人妻人人操| 激情开心五月天婷婷基地丁香社区| 色五月婷婷综合| 99re在线免费视频| 成人狠狠成人狠狠成人狠狠成人狠狠 | 国产99精品免费视频| 色欲婷婷五月天丁香| 狠狠爱深色婷婷综合| 久操婷婷| 五月天婷婷免费| 久久这里只有精品视频15| 丁香婷婷激情综合五月激情| 婷婷午夜激情| 九九精品热播| 久久五月天综合| 欧美五月停| 99免费成人网| 九九热只有精品| 99人人精品| 99性爱精品| 欧美日韩成人| 四色五月婷婷| 久久午夜理论| 激情丁香五月| 开心 五月 综合| 激情久久肏屄视频| 欧美图片丁香五月天| 蜜臀嫩草| 久久R激情| 77799热| 成人电影一区| 97干免费视频| 五月色丁香| 超碰京东热av男人的天堂| 呦呦v线| 99热这里只有精品在线观看| 久热超碰| 人人干人人看| 99综合色色色| 五月丁香六月天| 玖玖爱资源站| 色色色干| 日韩黄黄| 色色色五月婷婷| 亚洲色基地| 五月天 另类图片| 丁香,开心成人,久久| www..com色爱| 国产精产国品一二三在观看| 米奇激情婷婷| 六月婷婷色色网| 五月天影院婷婷在线观看| 久草婷婷| 九九热视频免费观看| 国产亚洲精品久久久久久豆腐| 日本韩国视频在线观看社区免费的9| 开心久久xxx色| 丁香六月在线| 永久思思热在线| 大香蕉婷婷| 在线色色| 丁香五月手机在线| 久色视频首页| 超喷97免费在线视频| 五月丁香久久久日婷婷久久婷婷日| www超碰| 综合亚洲五月天| 囯产精品久久欠久久久久久九大| 丁香五月AV在线| 日本九九九九| 久色中文| 久久婷婷大香蕉| 丁香五月六月婷婷怡红院| 日本nghangse中文字幕| 五月婷婷六月丁香五月| 婷婷永久在线| 天天综合网站| 天天射天天射一道本日本社区| 色婷婷丁香女女| 久久婷婷五月草视频| 色狠狠婷婷| wwwwww.色| 色婷婷精品视频在线播放| 人妻VideOssS人妻高清| 五月丁香婷婷啪啪综合| 大香蕉五月天婷婷| 影音先锋女人av鲁色资源网小说免费 | 久久综合五月天| 日韩成人电影AV| 久久九九99| 亚洲第一色区| 九月婷婷激情| 可以免费观看的AV| 激情小说之五月| 七七色综合| 五月花在线观看视频| 五月婷婷久久久久| 天天综合网在线| 五月丁香婷婷无码A∨| 欧美大片免费播放器| 狠狠色 综合色区| 日韩有码一区| 欧美精产国品一二三区| 狠狠看狠狠| www.超碰97| 牛牛碰免费| 丁香六月婷婷社区| 九九视频这里只有精品| 这里只有精品在线播放| 婷婷久久婷婷| 色五月婷婷五月| 五月丁香激情综合欧美| 五月天丁香欧美激情| 99精品视频偷拍| 99热在线爱| 极品人妻VIDEOSSS人妻| 亚洲综合色色| www.色婷婷.com| 人妻啪啪啪| 五月丁香六月婷婷中文版| 五月丁香综合色婷婷| 国产午夜一区二区三区| 丁香综合网| 婷婷五月成人| 色色日本| 色婷婷婷av| 这里只有精品视频在线| 丁香婷婷六月激情文学| ztEJj| 日日干日日| 色婷婷五月影视| 美女久久婷婷| 91人人操.COM| 精久久色| 婷婷色导航| 久久久国产精品黄毛片 | enecarbon-materials.comWu染请涟系Bao护@wip1688 | 热99AV网站| 色噜噜夜夜夜综合网| 色九月| 五月天六月婷婷电影| 亚洲色夜| 青柠影视免费高清电视剧| 五月天另类小说| 午夜天堂啪啪| 丝袜熟女一区二区三区| 九九激情| www.婷婷五月| 欧美日韩大黄| a在线免费v| 国产激情综合五月久久| 丁香五月人妻| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 日韩成人无码| 99玖玖在线视频| 丁香婷婷免费| 全高清无码视頻| 欧美色综合天天久久综合精品| 久久美女五月天| 伊人五月天日日夜夜久久久天天| 婷婷六月综合基地| 日韩黄色中文字幕| 色婷婷视频| 丁香五月无码| 丁香 婷婷五月| 91丨九色丨国产在线| 狠狠五月天| 欧美丁香婷婷五月天| 久思思热视频在线观看| 五月天丁香欧美激情| 色五月综合网| 99热新网址| 激情五月丁香激情综合网| 性色婷婷| 热久91| 欧美色婷婷| 色综合99| 色婷婷五月天在线| 天天操夜夜啊| 九九热大香蕉| 婷婷五月天性爱视频| 丁香五月影院| 涩综合网| 能直接看的av网站| 在线A色| 婷色五月| 国产综合婷婷| 超碰A V在线| 99精品在线观看| 97九色视频| 亚洲综合婷婷六月丁香五月| 二人电影免费版在线观看| 成人丁香色| 亚洲岛国电影| 大陆极品少妇内射AAAAAA| 婷婷丁香花五月天| 激情五月丁香亭亭| wwwxxx五月婷婷小说| 9999久久久久| 色噜噜狠狠色综合网| 碰人人97| 97色五月婷婷在线| 激情五月天婷婷| 91丁香五月| 婷婷五月天六点丁香五月| 色9色| 99福利导航| 色综合久久88色综合天天| 欧美私人家庭影院| 思思热在线观看| 九九亚洲综合| 国产精品国产| 99在线观看精品视频| 99色热综合| 婷婷丁香六月五月天| 琪琪色五月天| 操日视频| 超级碰碰碰碰视频| 久久九⑨| 色爱综合五月| 97ai婷婷| 六月丁香开心婷婷欧美| 婷婷情色五月| 亚洲成人电影在线免费观看| 伊人五月婷| WWW.国产| 色婷婷av在线观看| 91九色精品熟女内射| 开心五月婷婷激情| 中文字幕在线资源| 国产精品久久..4399| www.99热这里精品| 五月天久久婷婷| 天天舔天天摸天天透| 激情六月五月婷婷综合网| 久久这里只有精彩| 日日干五月天婷婷| 精品视频这里只有精品| 9.1综合网| 色婷婷婷婷| 五月婷婷影| 欧美成人日韩| 久久久久久久久久91| 国产小网站| 欧美六月婷婷| 国产1区2区| 狠狠色丁香久久综合婷婷亚洲成人福利 | 亚洲综合网激情小说| 色波激情五月天| 久久免费精品小视频| 五月丁香啪啪激情| 丁香婷婷六月激情文学| 深爱五月激情网| 五月天五月色婷婷综合| 色婷婷婷av | 婷五月天| 综合五月丁香六月婷婷| 午夜爱爱网站| 久久98| 久久久久久久久久8888| 久久这里只精品| 亚洲色视频| 日韩色色视频| 五月婷在线| av国产精品| 成人做爰高潮A片免费视频| 青青青在线视频国产| 国产亚洲精品久久久久久郑州| 免费观看18视频网站| 国产精品涩涩涩视频网站| 少妇高潮呻吟A片免费看软件| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 26uuu丁香婷婷五月| 色五月婷婷影院| 五月丁香六月成人| 日日夜夜天天综合| 天天操天天插| 成人综合视频网址| 免费看片在线观看| 久久婷网| 中文精品久久久久人妻不| 丁香五月天色综合| 五月婷婷丁香五月婷婷| 五月天激情www| 五月丁香婷婷综合| 亚洲五月婷婷| 国产av天堂| 黄色国久久| 欧美,日韩成人在线| 婷婷五月a| 狼人婷婷综合| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 狠狠干狠狠干狠狠干狠狠干| 婷婷色五月天在线| 97久久人人操| 最近中文字幕大全免费版在线| 免费无码毛片一区二区A片| 婷婷丁香成人色综合| 激情五月天情色| 伊人碰碰婷婷| 日韩免费乱轮网站| 大地资源色婷婷视频在线| 婷婷伊人网| 日韩在线9| 激情深爱五月天| 男同91 | 思思热久久婷婷五月天| 99综合网| 亚洲AV成人在线| 伊人高清无码| 久操干| 欧洲永久精品| 婷婷五月丁香综合人妻| 男人天堂99| 狠狠综合网| 99热最新国内| 91九色|疯狂|高潮|对白|| 日韩 欧美 国产 一区 二区| 色婷亚洲| 丁香五月婷婷激情网| 国外亚洲成AV人片在线观看| 丁香六月av| 深夜男女福利刺激影院一区完整| 色噜噜五月天| 免费日韩99| 丁香五月天在线| 九月丁香亭亭| 欧美日韩二区在线| 91色色色18| 99综合婷婷五月| 丁香桃色网| 五月婷婷激情综合| 天堂二区| 丁香色婷婷| 99.色| 99热综合色图| 国产美女无遮挡裸体毛片A片| 大香蕉懂9| 思思热天天看| 色婷婷基地| 亚洲激情在线| 夜色爱爱亚洲| 色五月xxx| 色五月综合激情| 五月色网| 九久热| 色色无码日韩| 日欧大屏操| 综合五月婷婷| 久久婷婷亚洲无码一起| 五月综合婷婷网| 五月天停婷基地| 国产成人精品一区二三区熟女在线| 亚洲欧洲另类| 色天使久久综合| 色香蕉影院| 五月天俺去也| 九九激情网| 婷婷丁香社区| 亚洲日韩26uuu| www.henhenl| 欧美成人在线观看| 久99| 天天干天天日天天操| 丁香五月影院| 久婷| 强伦轩人妻一区二区电影| 五月丁香久久| 九色91美女| 97五月天婷婷| 99精彩视频| 色在线99| 亚洲婷婷激情五月天| 天天日日夜夜| 九九自拍网| 婷婷六月花| 超碰99热| 99热免费精品| 可以直接看的av| 国产FREESEXVIDEOS性中国| 丁香五月婷婷亚洲综合精品| 女高怪谈在线观看| 淫五月停停| 99热久| 久久激情五月| 久久五月天影院| www久久99com| 99日在线视频| 超碰成人AV| www.sezonghe| 五月天激情婷婷| 欧美丁香五月97色| 婷婷五月天无码| 欧洲电影在线观看免费版英语版| 五月丁香六月综合情在线观看| 五月婷在线| 伊人网色婷婷五月天| 99热免费精品热久久66| 99操久久| 国产精品丝| 亚洲视频图片婷婷五月| 亚洲无码影音| 五月丁香婷婷综合激情基地| 丁香五月激情图片| 亚洲乱码精品久久久久..| AV在线观看网站| 人妻久久久久久久| 中文字幕av久久爽| 激情综合色五月丁香六月亚洲| 五月丁香色婷婷| 婷婷天堂综合| 色婷婷A| 日日噜噜久久婷婷五月天| 久久99热精品a片在线观看| www.色综合| 五月婷婷黄色| 伊人狠狠丁香婷婷综合尤物| 久久九九精彩| 亚洲最大视频| 久久女人九九| 色五月激情婷婷| 婷婷五月,综合伊人| 五月开心六月婷婷在线播放网站| 色色色色综合网| 香蕉久久国产AV一区二区| 色哟哟www| 碰碰操91| 激情六月婷婷| 成人网页在线观看| 丁香五月手机在线| 91丨九色熟女丨首页| 丁香六月久| 日韩一级淫乱片一区二区三区| 99综合99| 日韩在线观看网址| 综合久久五月| 丁香六月天婷婷色| 巴基斯坦粉嫩无码视频| 爱iii做iiii日日| 一本伊人色婷| 婷婷伊人综合| 日日综合网| 九九久99免费视频| 亚洲欧美一区二区三区爱爱动图 | 99综合免费视频| 色婷婷久久综合| 97干免费视频| 99热99在线| 激情综合色网| 激情五月综合婷婷| 人妻操逼| 久久一级AV| 国产精品A片| 人妻有码乱操| 五月六月丁香激情| 亚洲有码在线视频| 久综合色| 国产 码在线成人网站| 婷婷激情小说| 人妻系列久久久久久久久久久 | 草婷婷在线| 色欲AVV| 深爱激情六月| 日韩综合久| 97操碰在线视频| 97在线/亚洲| 欧美在线视频99| 色婷婷五月天亚洲| 亚洲乱码日产精品BD| 六月丁香婷婷色69| 五月丁香A片| 激情综合五| 日本久久婷婷| 色婷婷五月天| 色高清无码视频| 91a片爽| 狠狠干五月天| 先锋五月婷婷丁香草草| 色婷婷视频| 综合视频五月| 超碰激情五月| 亚韩在线视频| 精品无码av丁香五月激情| 九九99九九精品免费 | 日韩精品一区二区亚洲AV观看| 久99久在线| www.超碰在线| 操你av| 人妖色AV色综合| 欧美天堂久久| 五月丁香怕怕综合| 人人操9| 色五月婷婷九月| ww久久| 天天综合精品| 久热网站| 情色五月天网站| 久热免费视频| 婷婷五月天开心激情网| av久热| 青草视频在线观看视频| www,婷婷| 五月婷婷久久综合| av一级棒av| 激情五月天偷拍综合网| 天天爱天天做天天日| 香蕉97碰碰碰欧美| 桔色成人在线| 九九婷婷综合| 久久女婷| 狠狠色噜噜色狠狠狠综合久久成人波 | 噜噜色五月| 色婷婷很很丝袜| www.天天干| 欧美情月伍月天| 激情五月婷婷视频| 狠狠99| 开心六月丁香五月婷婷| 人人操婷婷| 五月天堂婷婷| 六月丁香综合网| 丁香五月天婷婷91| 99色在线观看| 婷婷综合网| a色色色色色| 亚洲mm免费| 热久久91| 丁香五月,激情五月,深爱五月| 综合色视频| 伊人啪啪网| 99er视频在线| 爱射综合| 午夜激情四射影院| 99精品热| 婷婷播5月| 欧美va精品va老师va| 日本婷婷色| 99热最新网址| 色婷婷裸体色性在线| 五月婷在线观看| 五月婷婷丁香日韩在线| 五月婷婷综合激情网| 狠狠干五码| www.91久久| 依人大香蕉在钱1| 在线看片av| 五月丁香六月花| 亚洲中文字幕网| 亚洲图片 丁香婷婷| 99色免费观看全部| 六月丁香五月天| www.99热国产| 操九色| 色一色综合| 日韩啪啪网| 五月 婷婷 成人| 五月丁香六月婷婷精品| 婷婷爱五月| 亚洲情综合五月天| 99日韩| 婷婷丁香五月综合网上| 美女天天久久| www久久久久久| 中文字幕丰满孑伦无码专区| 天天肏在线观看| 。久久久久久久久久久久久久人妻| 精品思思久久| 玖玖婷婷色| 久草婷婷网 | 河北真实伦对白精彩脏话| 中文字幕不卡+婷婷五月| 婷婷射婷婷舔| 丁香婷婷丁香五月欧美人| 婷婷五月精品中文字幕| 99国产99| 亚洲乱码日产精品BD在线观看| WWW99热| 日本久久爱| 天天婷婷操| 丁香五月天堂| 久久hd| 四色五月婷婷| 最近中文字幕2019视频1| 99热国产| 天天干一干| 99热成人在线观看| ji'qing'luan'ren'lun| 噜噜噜噜婷婷五月天| 91综合在线视频| 亚洲99热| 中文字幕精品无码一区二区| 久久久免费精彩视频| 五月天成人在线播放| 亚洲综合色棒| 亚洲精| 丁香五月 综合| 大香蕉五月天| 久超超碰| 嫩草视频观看| 91综合视频在线| 五月激香蕉网| 熟妇内谢69XXXXXA片| 丁香成人五月天| 人妻精品在线| 亚洲人妻电影| 欧美色婷婷| 色99热| 五月综合激情视频| 日韩av干| 青草视频在线蜜臀| 狠狠艹狠狠艹| 丁香五月婷婷色| 天天综合网91| 五月丁香好婷婷A片网| 9超碰在线| 亚洲第二AV| 久久久久97| 99精彩视频网站在线| 婷婷爱五月| 五月色丁香| 久久综合婷婷五月| 五月婷婷影院| 99热思思| 狠狠色成人影片| 色色网站在线| 99精品在这里| 亚洲综合五月天婷婷| 色久五月天| 婷婷五月天日本无码| 国产日日操夜夜操的肉棒视频| 婷婷免费无视频| 天天色五月| 丁香五月天婷婷久久| 亚洲婷婷月丁香五月| 热无码A∨| 激情5月婷婷狠狠干| 五月天无码视屏播放| 六月丁香啪| 开心激情色婷婷五月天| 伊人五月婷婷| 密臀久久| 99热这里只有精品69| 五月开心婷婷| 天天操,夜夜骑| 丁香综合网| 天天色综合图片| 久久久久久性爱视频| 亚洲va在线∨a天堂va欧美va| 色色射| 婷婷五月天狠狠色| 婷婷少妇激情| 色一情一乱一乱一区91Av| www.五月.com| 久久五月综合| 国产精品久久久久9999小说 | 五月天婷婷基地综合网| 99自拍视频网站| 9久热| 華人性愛AV在線| 国产夫妻操逼内射视频| 日日射天天射| 婷婷五月天激情综合深爱激情 | 日韩成人网址| 五月天另类激情在线| 97色在线| 九九操屄| 婷婷日本色| 亚洲婷婷婷| 久99久视频| 成人精品一区二区三区四区五区| 四色 爱 婷婷 精品 亚洲 五月天| 久久这里只有精品网| 久久精品永久免费| 99热只有精| 激情五月色在线播放| 99视频在线观看网址| 99精品网| 久久久97| 国产成人精品一区二三区熟女在线| 激情操逼婷婷| 超碰京东热av男人的天堂| 亚洲激情六月| 婷婷色啪| 5月色婷婷| 在线观看玖玖资源免费观看| 99热这里只有精品3| 啪啪99| 色丁香久久| se色婷婷视频| 九九久久高清| 狠狠色丁香| 天天模,夜夜模夜夜爽| 丁香五月婷在线观看| 五月激情综合网| 久久狠狠干| AA片在线观看视频在线播放| 91亚洲免费片| 色色五月丁香| xfplayav在线| 激情丁香五月天图片| 丁香五月婷婷色情综合| 激情99| 天天玩夜夜操| 99综合五月免费视频色婷婷| 激情婷婷九月| 六月婷婷深深爱| 婷婷五月天综合色| 五月天婷婷免费| 狠狠操天天干| 69人人操人人爽| 丁香激情网| 99久久思思| 五月天精品| 99免费视频网| 五月婷婷影院| 色婷婷在线视频| 人人操操97| 天天艹天天综合网| 综合五月激情网| 婷婷欧美综合| 极品人妻VIDEOSSS人妻| 色五月婷婷激情基地| 无码地址| 综合五月网| 亚洲这里只有精品| 午夜天堂一区人妻| 婷婷五月,偷窥偷拍网| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 26uuu国产| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 五月丁香久久综合色| 色欲婷婷夜夜| 色婷婷五月在线| h在线看免费版在线看| 丁香亚洲色综合| 99自拍视频在线| 九九热视频思思| 91精品婷婷国产综合久久| 日韩AV中文在线观看| 中文字幕欧美久久| 五月激激网w'w'w| 大香蕉久久婷婷| 99ER热精品视频| 国产精品美女| 十月丁香婷婷| 精品久久久人妻| 五月天激情四射| 欧美日本高清视频99| 色色99色色| 婷婷成人视频| 亚洲成av人影院| 69久久99精品久久久久婷婷| WWW色综合| 十一月婷婷激情四射| 中字幕视频在线永久在线观看免费| 久久婷婷丁香视频网| 色婷婷丁香五月在线| 97色女人在线| 老师高潮流白浆喷水的A片| 亚洲高清在线| 99这里只有精彩视频| 婷婷久久大香蕉| 97久久精品视频| 激情婷婷内射| av免费在线看不卡无毒| 丁香五月亚洲AV| 久久精品五月天| 九九这里只有精品在线视频| 99在线观看视频| 色婷婷五月天不卡| 97天堂| 一本九九色| 丁香婷婷色色| 婷婷五月天网| 97九色视频| 99re6热在线精品视频播放速度| 综合色色色色色色| 最近韩国日本免费高清观看| 99久在线观看| 九九热视| 无码 av电影| 99ri国产在线| 天天肏天天插| 狠狠爱婷婷爱| WWW.99热| 婷婷婷五月香蕉| 婷婷六月网| 99操99| 91精品无码久久久久久五月天| 婷婷激情区| 久操婷婷| 激情婷婷丁香色五月| 人人爽人人爽人人爽人人爽| 99视频| 日本激情91| 婷婷五月激情五月激情| 婷婷视频在线| 日日操夜夜操狠狠操| 97操视频| 玖玖五月丁香| 久久人妻伊人| 丁香五月激情久久麻豆| 亚洲色婷婷99一9|| 丁香六月婷婷久久综合| 色九综合| m色激情网| 被男人添B超爽视频| 日韩成人免费电影| 激情五月天影院| 久久综合五月情| 日在线V视频在线播放| 欧美精品18| 婷婷丁香激情综合色情| 99成人在线观看| 色吊丝99| 99久久综合网| 日夜操B| 在线你懂的亚洲欧| 色婷婷久久| 色级婷婷| 婷婷中文字暮| 欧美 色婷婷| 婷婷丁香五月激情图片| 69精品人人人人| 婷婷五月天成人在线视频| 欧美精品99| 67194中文字幕| 天天噜噜| 亚洲日本三级片| 丁香五月婷婷天激情| 亚洲九区| 婷婷五月天激情四射五月天激情| 国产激情久久久| 久久久91| 爆乳熟妇一区二区三区爆乳| 欧美久久网| 色欲婷婷五月天丁香| 超碰高清在线| 99久久免费精品| 人人操9| 丁香五月综合亚洲| 欧美顶级少妇做爰HD| 精品婷婷五| 亚州操人在线视频| 丁香五月大香蕉| 99re在线观看| 婷婷她六月天| 五月婷婷综合在线| site:xmssd.com| 五月天开心网| 色五月丁香总合网| 色播五月丁香| 婷婷五月天成人动漫 | 国内自拍97在线| 天天舔天天摸天天透| 老美AA片| 六月婷五月丁香| 国产真实乱了老女人视频| 色婷婷综合中心| 亚洲亚洲人成综合网络| 中文字幕婷婷五月天| 五月丁香影院| 欧美色色色色色色色色色色影视| 色五月激情网| 久久奄也去色色网站| 国产精产国品一二三在观看| 第四色婷婷五月| 操B无码视频国语| 亚洲成人噜噜| 五月丁香色色色| 亚洲射激情| 97人妻超级碰碰碰碰碰| 亚洲婷婷五月天激情综合| 亚洲超碰中文字幕| 色五月丁香婷婷在线观看| 综合激情专区| 99热爱爱干干日| 色婷婷五月天av在线| 色激情五月天| 六月婷婷七月丁香| 男人操女人高潮91视频| A网在线欧洲| 99在线爽| 婷婷五月天激情综合网| 日本大逼91| 啪啪色区| 五月丁香啪啪网| 婷婷五月色| 久久五月丁香伊人青草| 99久久99九九99九九九| 五月婷丁香在线视频在线| 九九九九九九热| 色综合色色| 碰碰女| 激情小说五月天| 五月天小说激情| 免费日本aⅴ中文字幕| 色五月天激情| 丁香五月成人丝袜| 99re免费精品视频| 亚洲激情免费久久| 91干婷婷| 色婷婷在线视频| 99爱爱| 国产欧美熟妇另类久久久| 极品五月天| 大香蕉人人人| 91丨九色丨熟女| sS丁香五月婷婷| 五月丁小婷婷激情四射| www五月| 久久9视频| 天天做天天爱| 五月丁香伊人网| 久久婷婷综合拍| 激情五月丁香五月| 九九热视频免费观看| 五月刺激丁香月综合| 丁香五婷婷| Xx色综合| 少妇伦子伦精品无吗| 婷婷激情五月综合| 91ncom.色| 色色性爱视频| 开心五月丁香啪| 日本黄色在线观看| www.99热| 久久人妻系列| AAA久久久AAA久久久AAA| 夜夜撸日日操| 狠狠操狠狠干综合| 香蕉婷婷色五月| 99re8这里只有精品99re8热视频| 另类小说五月天综合网| 香蕉网久久| 99自拍视频在线观看| 亚洲色 视频| 激情视频综合| 开心五月深爱五月| 色六月视频| 色五月大香蕉婷婷| www.狠狠| 99视频在线精品免费观看2| 色综合婷婷| 五月伊人91| 日韩久久视频| 亚洲99在线| 色呦呦美女| 五月综合视频| 国产精品久久久海的味道| 丁香婷婷六月婷婷六月婷婷六月婷婷| 91在线资源| 婷婷久久五月天| 婷婷五月天首页| 99自拍网| 1级欧美日韩| 亚洲成人网站在线观看| www.日日夜夜| 五月丁香啪综合| 人人艹艹艹| 色玖玖爱| 激情五月亚洲| 亚洲AV网站在线观看| 日韩成人精品中文字幕电影| 在线只有精品| 亚洲性图一区二区三区| 伊人九九综合| 人妻熟人中文字幕一区二区 | 女高怪谈在线观看| www.超碰在线| www.韩日视频| 97色天堂| 这里只有精品视频看看| 五月丁香成人| 中文不卡av| 亚洲色婷婷五月天| 狠狠操狠狠操| 激情五月婷婷在线区| AV操逼网| 伊人色综合网| aaa久久| 天天爽夜夜爽天天爽夜夜爽| 丁香5月激情网| 少妇婷婷五月天| 欧美午夜乱妇午夜福利| 少妇高潮一区二区三区99欧美| 开心激情久久久久久久| 国产成人综合网| 强奸幻女毛片| 国产亚洲成AV人片在线观黄桃| 亚韩在线视频| 九九99一区| 色婷婷在线综合色播网| 欧美色宗和激情| 婷婷丁香无码专区| 九九九九国产| 五月丁花六月丁香综合| 色五月av伊人| 日本99久久| 亚洲4区国产欧美| 色哟呦av| 日日噜噜夜夜狠狠久久丁香五月| 五月丁香六月激情在线| 99re这里有精品手机在线| 一级精品999WWW| 超碰cap| 五月综合久久| 丁香五月首页| 婷婷五月天日本无码| 淫荡家庭AV| 五月丁香激| 五月色婷丁香| 婷婷六月丁香五月图区| 色色综合网站| 精品婷婷| 激情五月综合网最新 | 182tv992tv人之初午夜免费观看| 人妻AV在线| 色五月首页| 婷婷五月天亚洲综合| 久久在这里有精品| 99久久九九| 久色激情| 综合日本婷婷| 99九九精品视频推荐| 高清一区二区三区日本久| 91婷婷五月天嫩女| 天天影视色综合网| 五月丁香六月欧美综合| 亚洲婷婷在线播放十月| www99在线观看视频| 久久 中文 日本| 色啪久| 欧美成人一区二区三区在线视频| 五月天婷婷影院| 91久久久久久| 丁香六月色婷婷| 我要射综合| 秋霞电影理论| 欧美va视频不用播放器的va视频网| 级情九色| 久久人人九九| 久久九九囯产| 激情五月婷婷视频| 极品少妇XXXX精品少妇偷拍| 97久久久| 色播五月| 婷婷激情五月| 久久99操| 婷婷五月综合体验看| 思思热再线视频| 爱草视频在线观看| 激情精品久久| 国产免费一区二区三区三州老师F1F1.CC| 亚洲第二AV| 99热www| 五月色激情综合网| 久久色吧| 操比激情五月| 18久久| A级毛片高清免费不卡播放谢谢谢谢| 免费色婷婷| 91伦| 日韩精品无码AV| 久热在线观看视频9| 九月婷婷综合色干| 新男人天堂人妻| 久久人操-久草婷婷-成人AV| 91九色PORNY中文啦| 任我肏视频精品| 熟女国产在线一区二区三区四区| 丁香五月婷婷www..com| 97伊人综合婷婷| 色五月97| 中文字幕,综合,91| 婷婷五月综合社区| 好看的国产精品| a网站免费观看| 婷婷五月成人| 成人无码精品1区2区3区免费看| 99日韩| www色婷婷| 国产亚洲成AV人片在线观黄桃| 色www久视频| 日韩无码AV电影网站| 激情五月成年| 一区无码| 淫视馆av三区| 在线91日韩| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 狠狠香婷婷五月| 激情五月激情综合网一级丸片| 丁香婷婷五月天校园春色| 九九热在视频| 青草热视频这里只有精品| 成人丁香婷婷五月天| 久久一热| 99视频在线播放大全| 91精品久久久久久久久| 大香蕉婷婷色| 日韩AAAAA| 中国女人做爰A片| 日本久久九| 99久久色| 99日逼视频| 性韩日色婷婷五月天激情啪啪XXX| 激情亚洲五月| 香蕉久日夜| 欧美婷婷色五月网| 五月丁香久久呀| 五月天激情综合在线| 99色在线观看免费| 涩涩五| 激情五月色播五月| 久久精品9| 中文字幕在线免费观看视频| 六月丁香网| 五月丁香久久激情综合| 丁香玖玖| 色色五月天丁香| 天天 青草 制服丝袜 在线| 99热精品9| 99综合| Av大香蕉| 精品一二三区久久AAA片 | 涩综合婷婷| 超碰人人干| 亚洲妇女熟BBW| 91九九精品| 99色天堂| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | 一本久久婷婷| 无码人妻一区二区一牛影视| 99热综合色图| a色色色色色| 啪啪啪五月天| 天天爽夜爽| 五月婷六月| 婷婷五月天97干| 日韩精品一品二区三区的使用体验| 男人天堂99| 日本五月丁香| 天天色天天操天天射| 久久婷婷亚洲| 婷婷色色色| 色婷婷免费观看| 99在线视频精品|