欧美成人午夜精品久久久,国产?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
返回資訊列表
玖月婷婷爱丁香| 天天做天天要天天爽| 激情色色色| 丁香花五月天| 久久久com| 天堂伊人干| 久久WW| 丁香五月色色色色| 无码啪啪| 色碰干| 国产AV一区二区三区最新精品| 狠狠色噜噜狠狠狠狠综合| 成人操呦av| 亚洲综合色激情色五月| 大地资源色婷婷视频在线| 五月天成人网在线观看| 丁香五月婷婷骚视屏| 久婷| 开心五月综合激情网| 久久您您综合网| 五月婷网| 能看的av网站| 国产日韩欧美| 婷婷六月久久综合导航| 操射国产日本| www.五月天。com| 色婷天天| 五月激情网站| 91精品国产99久久久久久天美| 五月J香蕉婷婷| 久久五月天婷婷| 51avj视频大全| 五月婷婷在线视频免费观看| 久久99久久99精品免视看婷婷| 五月天久久激情| 超碰日韩成人| 婷婷伊人五月天| 91人妻PORNY九色大屁股| 日韩色色视频| 成人色图情色成人网 www.5b5b5bcom 五月天| 五月婷婷久久网| 亚洲婷婷视频| 五月丁香激情啪啪| 婷婷五月激情的图片| 九色无码| 91久久久久久久久久| 2018国产大陆天天弄| 色色激情| AAA久久| 91综合国免费久入| 欧美精品999| 超碰国产在线观看| 大香蕉五月天婷婷| 99日韩| 9久久精品| 六月99天天婷婷激情综合| 婷婷五月,偷窥偷拍网| 天天撸天天干天天插| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | av一区二区电影免费在线观看| 国产熟妇的荡欲午夜视频| 99热在线观看| 草草色情综合网| 日曰躁夜夜躁2026| ady狠狠入| WWW久久99久久99久久| 亚洲V国产V欧美V久久久久久| 亚洲日韩一页精品发布| 国产毛多水多女人A片| 99爱在线视频| 嫩草AV久久伊人妇女超级A| 可以免费观看的av| 欧州婷婷五月天综合| 另类丁香五月天区图| 色五月亚洲| 影音先锋91网站在线观看| 色135综合网| 久久久国产精品黄毛片| 美国不卡视频| 玖玖在线视频福利| 深爱激情av| 色婷婷五月亚洲| 五月丁香在线看| 六月婷婷五月天| 五月丁香五月综合欧美| 91九色国产在线| 九九热99精品在线| 成人视频在线免费播放| 99无码黄色视频| 久久草人妻| 夜夜夜夜做天天天做无码视频| 精品99只有。| 啪啪激情综合| 97人妻超级碰碰碰碰碰| 激情久久久久久久久| 久久草中文日韩欧美| 色婷婷婷av| 色情五月天首页| 青草少妇激情| 91丨九色丨国产打屁股| 九九热99精品| mmm1717.6dbm人人爱人人操| 夜夜躁婷婷AV| 五月天开心网| 99久久超级| 久婷婷视平| 色婷婷激情五月天丁香| 超碰人人干| 日韩一区二区三区无码| 直接看的AV| www.婷婷五月| 91亚洲天堂| 综合网色| 激情婷婷六月天| 五月婷婷五月| 黑人熟妇一区二区三区| sS丁香五月婷婷| 99色最新在线视频网站| 99热久| 99久高清视频| 婷婷五月天伊人网在线观看视频| 超碰免费人人| 日本精品人妻无码77777| 色婷婷久久综合中文久久一本| AA片在线观看视频在线播放| 五月开心久久| 这里只有免费的精品| 91丨九色丨高潮丰满日本| 香蕉97碰碰碰欧美| 92久久精品一区二区| 亚洲国产网址| 六月五月婷婷| 五月色综合| 亚洲AV无码影院| 青青草搞屄视频网站| 亚洲这里只有精品| 高清 码 免费看片短视频| 手机看片日日做夜夜| 99色看这里只有精品| 五月婷婷香| www.狠狠操| 无码成人AAAAA毛片AI换脸| 91久久精品无码一区二区三区| 五月天色婷婷小说| 91超级碰碰碰| 欧洲激情网站| 九九视频在线观看| 欧美99热| 日本99久久| 狠狠色综合无线观看| 欧美五月丁香啪啪响视频| 可以看的av网站| 人人人操 超碰| 五月色婷婷亚洲| 操逼巨乳91| 婷婷天堂伊人| 九色色| 丰满少妇猛烈A片免费看观看| 9精品在线| 大香蕉院线| 午夜天堂啪啪| 有码人妻久久| www.9操| 五月天婷婷激情网| 超碰99在线观看| 99riAV国产精品视频| 色婷婷裸体色性在线| 精品一二三区久久AAA片| 久久九九网| 婷婷五月天亚洲图片| 91大神操美女| 婷婷精品在线| 丁香五月色色| 九色PORNY9l原创自拍| 人人摸人人干人人做| 成人国产欧美大片一区| 天天操夜夜爽| 亚洲av成人一区二区电影在线| 久久婷婷五月综合色丁香| 日韩av一区二区在线/日产精品久久久| 亚洲国产色婷婷| 婷婷天天日婷婷| 色噜噜狠狠狠狠色综合久欧美| 精品福利911| 婷婷五月色| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 亚洲男女激情| 大香蕉天堂| 激情图片婷婷丁香五月| 色狠狠色| 色婷婷丁香五月| 激情综合青草| 亚洲综合五月天婷婷| 五月丁香怕啪啪| 99九九精品| 干亚洲天堂| 久久久中文| 精品国产人人爱人人| 狠狠色综合网| 色色COm| 99re6在线视频精品免费| 六月婷婷色五月| site:pnnrt.com| 久久ww| 国产 码在线成人网站| 色综合久久88色综合天天99| 五月天婷婷色在线视频免费观看| 成人丁香| 26uuu色噜噜精品一区| 婷婷伊人五月天| 久久婷狠狠色| 亚洲乱码日产精品BD| 青草激情在线| 丁香久久综合| 51精品国自产在线| 五月天伊人手机在线播放AV| 亚洲婷婷综合视频| 激情久久久| 另类婷婷丁香| 99人妻碰碰碰久久久久视| 五月婷婷六月丁香综合| 另类小说婷婷色| 色99免费视频中文| 九九Av| 欧美婷婷九月| 婷婷激情五月| 久狠日av| 久久五月天大美女| 超碰99热在线观看| AA丁香综合激情| 色色综合网络| 草美女在线观看视频在线播放 | 99九九精品视频推荐| 骚。com| www.色五月.com| 日本99久久| 色五月首页| 婷婷五月综合久久中文字幕| 色欲AVV| 99在线热| www激情婷婷com| 97AV在线视频| 99在线一区| 日本天天色| 六月丁香社区| 亚洲无码yw| 9+1视频网址| se99视频| 蜜乳A√| 久久新| 久在线88综合| 99热这里只有精品9| 色综合综合色| 国产婷婷综合| 97色婷婷成人综合在线观看| jiuse91在线| 热久国产| 色五月综合在线| 激情五月,色五月| 亚洲图色五月天| 99爱视频| 日日爱激情| 97碰在线| 久久ri精品视频| 色色射| 99热这里精品| 婷婷香五月综合激情| 九九香蕉网| 香蕉97碰碰碰欧美| 超碰免费99| 五月天婷婷在线观看| 狠狠 婷婷| 日本黄色精品| 香蕉久日夜| 亚韩在线视频| 思思热精品在线观看| 丁香香五月激情免费视频| www.五月丁香| 这里只有精品96| 九九99久久| 天天搞天天色综合| 五月婷婷视频在线观看| 丁香婷婷噜噜| 天天操人人干| 色五月五月天色婷婷色五月| 婷婷九月丁香| 99热日韩| 亚洲第一精品成人999久久精品| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 超极99精品| 做爰丰满少妇1313| 亚洲第一成人无码A片| 日本欧美在线| www.99视频| 久热9| 色色a| 久久综合人妻| 久久婷婷综合五月趴| 婷婷五月天首页| 五月丁香在线偷拍视频| 天堂AV在线看| 超碰熟女拍拍| 亚洲啪啪网| 亚洲丁香五月天视频| 很很干夜夜干| 99狠狠操一| 几激情五月婷婷色五月色天堂| 天天爽天天日天天舔| 亚洲第一色区| 亚洲激情网| 伊人五月成人| 99热一区| 日日肏夜夜干| 色爱亚洲| 激情五月激情综合网| 欧美va在线观看| 舔色婷婷| 天天日日人| 五月丁香亚州综合网| 性爱激情久久| 五月久久婷婷天堂视频| 国产片天天爽夜夜爽| 26UUU成人网| 色五月丁香一区在线| 伍月激情天| tingtingjiqingwuyue| 色综合播放| 五月婷婷m| 久久精品亚洲一级牲爱综合| 婷婷五月天激情电影| 婷婷中文在线| 国产67194| 久久久久久人妻| 丁香六月欧美| 人草人人| 久久人人九| 五月天综合在线| 伊人久久婷婷| 东京热人妻一区二区三区在线| 成人视频免费观看高清完整版在线观看| OUMEIRIHANCHENGREN| 成人免费在线电影| 99高级会所久久| 国产精品婷婷午夜在线观看| 内射综合网| 九九色婷婷| 久久婷婷青青草| 99视频日韩| www.婷婷亚洲基地| 玖玖资源站蜜臀| 玖玖五月丁香| 丰满少妇乱A片无码| 久久婷婷五月综合一| 亚洲婷婷五月| 色五月天视频| 久久机热/这里只有精品| 中文字幕有多少字| 九色91国产| 亚洲va欧美| 色婷五月| 激情六月婷婷| 国产成人综合亚洲| 99热线观看9| 五月丁香久久网| 亚洲另类在线观看| 天天澡天天狠天天天做| 成人无码精品1区2区3区免费看| 狠狠一日| 丁香五月综合激情久久潮喷| 色婷婷六月| 性爱综合网| 婷婷五月天AV在| WWW.激情| 天天射美女| 999热视频精品99免费在线| 另类视频综合| 色五月大| 久久一级免费黄色片| 激情99。| 婷婷综合五月天| 日韩av网站在线观看| 婷婷五月情色| 99久久婷婷国产综合| 伊人久久综合| 99九九精品视频| 色99色| 婷婷婷五月香蕉| 久久久妻人人人| 色情五月天首页| 婷婷五月天六点丁香五月| 久久综合影院 | 天天久久66xxx| 可以看的AV| 国产肥白大熟妇BBBB视频| 九九久久五月天| 狠狠操天天日| 日日夜夜干| 五月激情网站| 久久丁香综合| 亚洲AV无码影院| 思思热热久久| 婷婷五月天福利| 婷婷五月天丁香成人社区| 玖玖国产视频一区| 97福利视频| 五月停视频天堂| 成人在线日韩| www色五月| 在线另类视频| 91婷婷在线| 欧美激情中文字幕| 精品99视频| 色婷婷五月影视| 伊人深爱综合| Caoub青青超碰| 人人爽在线视频综合网| 99人人干| 免費亭亭成人| 99成人| 久er免费视频| 激情综合久久| 天天噪夜夜爽| 激情婷婷激情在线不卡| 79色色色色| 超碰妻人人| 亚洲久热无码| 丁香五月天激情四射网络不好 | 天天草人人摸| 高清一区二区三区日本久| 五月色婷婷在线观看| 五月天.com| 亚洲殴洲精品Av在线| 久久久久思思热| 啪啪五月婷婷| 天天干天天爽| 91人妻人人做人碰人人爽九色| 97AV在线视频| 国产永久一二一起草| 激情五月激情综合网| 狠狠做五月| 色综合婷婷| a久久| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 2015超碰| 激情综合网五月激情| 日本女天天爽| 五月天丁香婷婷久久九| 99ri视频在线播放| 欧韩性爱| 色色综合网www| 久久人妻伊人| 91啪啪视频| www狠狠| 天天操夜夜夜夜爽| 色综色网| 亚洲第一黄网| 婷婷玉月丁香五月在线视频| 真实熟女-91九色| 五月丁香影院| 五月丁香婷婷综合在线| 丁香操逼| 人妻22p| 操国产人妻| 婷婷综合九色伊人| 久久色五月天| 天天操夜夜夜拍拍拍| 婷婷五月另类网站| 99久久久久| 草草视频91| 九九色婷婷| 婷婷五月天综合小说网| 色播五月丁香综合| 五月天激情小说| 这里只有精品视频在线看| 亚洲婷婷激情综合激情999精品| 99色色网| 思思精品热在线| 91美女被操| 婷婷香蕉| 婷婷五月花丁香| 激情小说五月天| 色色射| 亚洲丁香五月| 九九热a| caop视频| 操人无码| 99热在线看| 久久国产性爱A V| 99热99草97| 99婷婷| 五月丁香婷婷免费视频| 激情综合女人网五月播播| 亲子乱av一区二区三区的| 天天爽夜爽| 激情五月小说婷婷| 五月天婷婷丁香蜜桃91| 丁香大香蕉| 精品欧美性爱超级爽| 五月婷天天搞视频| 五月丁香六月婷婷中合网| 色五月婷婷激情基地| 亚洲中文字幕在线观看| 色婷婷综合视频| 婷婷五月 丁香六月| 日日操无码| 免费精品99| 激情人妻综合| 五月天婷婷爱| www.亚洲激情| 深爱五月天婷综合| 婷婷丁香成人五月天| 超碰国产在线播放| 99精品视频在线观看| 日本三级中国三级99| 丁香六月五月婷婷| 99色热视频| 五月天婷婷午夜丁香| 五月婷婷草| 99在线精品免费视频| 六月丁香av| 五月婷婷在线视频观看| 欧美美美女性色视频| 人人干人人操人人摸人人做| 美女五月天婷婷| 日韩欧美一级大黄网站| 97色97干| 成人电影在线免费试看| 2017人人操| 欧美性生交XXXXX无码小说| 丁香五月欧美午夜视频| 六月丁香激情婷婷| 99精品爱| 婷婷丁香五月,狠狠综合| 六月婷婷狠狠| 激情六月五月婷婷综合网| 五月天日日操夜夜操| 日韩欧洲亚洲| 91超级碰碰碰| 天天爽爽日日做做| 日韩色色小视频| 色人久久| 五月婷婷在线视频免费观看| 99热 在线观看| 日本熟女视频一区二区| 五月婷婷激情综合在线| 99热 免费| 丁香综合伊人| www.狠狠色.com| 亚洲AAA| 婷婷五月综合激情小说| 丁香五月,激情五月,深爱五月| 丁香婷婷五色月| 丁香五月激情视频在线| 婷婷五月天综合色| 婷婷五月天精品| 天天操人人干| 日韩综合天堂| 欧美成人精品A片免费一区99| 久久99热这里只频精品6学生| 美臀自射自家人妻| 婷婷 激情 五月| 深爱五月亚洲| 色吧五月婷婷| 六月婷婷av| 国产精品成人AV在线| 五月丁香色婷婷| 激情综合网五月激情网| 激情五月天综合网| 国产白丝在线一区| 九九激情| A1片久久久| 欧美精品999| 久久婷婷五月综合伊人| 五月婷婷五月天| 嫩BBB搡BBBB榛BBBB| 五月婷婷很很色| 丁香97综合| 五月婷婷六月综合| 亚洲情色一区| 天天草天天舔| 久久九九热视频| 97婷婷丁香| 99性爱| 思思热在线视频精品| 丁香五月冃欧美| av人人干| 天天综合网站| 月色色综合婷婷网| 婷婷五月天天天日日夜夜| 激情五月婷婷啪啪| 天天日夜夜爽| 五月天激情小说网| 国产成人亚洲综合亚洲| 这里只有精品日韩| 色女伊人| 噜噜在线| 亚洲色婷婷五月天| 99人这里只有精品| 九九热精品| 丁香五月影院| 五月婷婷综合社区| 五月丁香六月婷婷不卡免费无码 | 久久加勤综合| av色婷婷| 色播五月丁香婷婷| 黄网在线观看免费| 最近中文字幕大全免费版在线| 五月丁香六月| 91麻豆国产三级精品福利在线观看| 青草视频在线播放| seav天堂| 在线观看的av| 丁香五月激情鲁| 婷婷在线免费| 91精品国产色猫| 国产五月丁香在线| www.91在线观看| 人与禽A片啪啪| 色级婷婷| 欧美va| 欧美日韩91| 丁香婷婷六月| va婷婷在线| 五月丁香六月情| 国产精品99久久久久久久女警| 99re久久| caopeng97人人| 激情五月天婷婷视频| 九色七七| 九九久久高清| 丁香社区婷婷五月| 日本综合色图| 久热91| 五月色婷婷综合丁香精品无遮挡| 五月天大香蕉| AV成人在线播放| 五月丁激情| 婷婷五月丁香五月天| 久婷久婷| 亚州色综合| 亚洲狠狠狠| 欧美性生交XXXXX无码小说 | 色99视频| 超级碰91| 五月婷婷六月少妇激情| 九九热在线精品视频| 色蜜婷婷| 激情综合五| 狼人伊人干| 婷婷五月天六月综合| 亚洲六月婷婷| 五月婷婷xxx| 五月天色色婷婷| 丁香色影院| 狠狠草狠狠草| 欧美三级大片AA在线看| 狠狠色激情在线| 开心五月激情网| 99热丁香| 日韩在线视频中文字幕| 另类伊人婷婷| 碰碰女| 九九99九九99九九99视频网| 色中色综合| 99A片| 激情久久四色| 五月天婷婷基地| 他改变了拜占庭| 五月丁香婷草| www.激情com| 五月丁香婷婷五月| 国产精品男人AV不卡| 婷婷色五月色妇| 日日撸夜夜操| 久久与婷婷| 五月婷在线观看| 9久久精品| 超碰在线超碰| 乱码操操| 九九久久综合| 久久视频婷婷视频| 玖玖精品视频| av大香蕉| 国产亚洲精品AAAAAAA片| 五月丁香WWW| 欧美性生交xXxX久久久| 婷丁五月| 91免费啪视频| 婷婷五月天影视首页| 99碰碰视频| 人人综合久| 天天爽人人综合免费7799| 五月婷婷激情网| 六月丁香婷婷亚洲中文玖玖| 91九色超碰| 五月天激情婷婷久久| 婷婷色在线视频| 亚洲欧美综合7777色婷婷| 99色综合网| 国产午夜成人免费看片无遮挡| 五月天成人在线播放丁香| 国产永久一黄| 26uuu在线观看| 日本成人噜噜噜噜噜| a毛片二逼wwwwwwwwww| 人妻肉射免费观看| 熟妇无码乱子成人精品| 日屌日日操日日色| 97操在线视频| 香蕉人妻AV久久久久天天| 五月天激情亚洲| 色色丁香婷婷| 日韩成人无码| 激情婷婷丁香| 996er热| 久久久97| 婷婷亚洲五月| 99er免费在线观看| 婷婷九月在线| 五月婷婷在线视频| 丁香婷婷色情社区成人小说| 丁香激情网| 五月婷婷久草| 99在线热| 丁香婷婷婷五月| 婷婷在线视频| se婷97| 久久久久er热| 99热只有这里才是精品| 九九色影视| 久久五月婷| 五月天色播网| 亚洲午夜一区二区| 成人在线视频网| 五月天婷婷乱论小说| 人人九色| 久久久全国免费视频| 婷婷六月丁| 9999热这里只有精品| 9精品在线| 665566 无码| 人妻久久久| 综合网天天| 天天拍夜夜爽日日| 九九激情综合| 综合精品99| 久草热8精品视频在线观看| 久久新地址| 99热精品在线免费观看| 丁香五月六月久久综合| 亚洲人成网站999久久久综合| 99色中文| 天天情色五月天| 久久久久久久97| 99年操人人爽| 免费AV播放| 久久久久这里只有精品| 五月婷婷丁香在线视频| 99热国产在| 国产日比| 夜夜资源站| 91色干| 色婷婷久久9.com| 丰满女老板BD高清A片| 丁香六月在线| 五月婷六月丁| 翔田千里无码| 日韩 欧美 国产 一区 二区| 996re热精品视频| 日韩av手机在线观看| 婷婷色在线观看| 久久这里只| RenRenSe在线视频网站| 精品一二三区视频立| 色人久久| 91久草五月天婷婷| 狠狠色狠狠色综合日日91| www,婷婷,com| 日韩AV无码影片| 99精品成人无码A片观看金桔| 婷婷五月激情小说| 久久五月综合| 日本色婷婷| 涩涩涩五月天| 精品久久久人妻| 99re这里有精品手机在线| 超碰人人在线| 九九久99免费视频| 91色色五月天| 日韩ww| 天天爽天天操| 久久在线视频免费观看| 国产暴力强伦轩1区二区小说| 久久久婷| www免费在线视频| 夜夜嗨一区二区三区直播内容| 日本精品人妻无码77777| 精品国产AV色一区二区深夜久久| 成人精品一区日本无码网| 99热最新网址| 97久久久| 综合五月天| 亚洲精品国产setv| 久久婷婷五月综合伊人| 久久久久99精品成人片| 精品视频99看在线视频| 久久五月丁香综合17C| 日逼免费视频| 丁香五月激情站| 色性日本| 天天色视频| 操逼视频一区| 激情AV在线| 9久精品| 国产 码在线成人网站| 国产美女无遮挡裸体毛片A片| 国产SUV精品一区二区883| 五月婷婷久久大片| 99久久偷拍视频| 久久人妻视频| 五月丁香在线观看| 五月丁香久久久| 丁香狠狠色婷婷久久无码视频| 性爱视频久久| 丁香色婷婷| 性做爰1一7伦| 91成人看| 大香蕉综合| 国产婷婷综合| 婷婷开心五月| 99久久久免费| 亚洲亚洲人成综合网络| 超碰在线个人观看| 婷婷五月激情图片| 五月婷婷综合激情| 色色 亚洲| 99热亚洲| 日韩无码专区| 成人精品免费在线观看| 色综合五月| www九九热| 日韩在线观看亚洲| 亚洲天天| 日本欧美成人片AAAA| 另类五月激情| 丁香婷婷色色| 深爱开心五月天| 久草热在线视频| 丁香五月婷久久| 99在线视频观看| 久久久性爱视频| 无码se| 综合五月草| 99国产小视频2013| 五月丁香六月婷婷久久肏| 九九av| 五月丁香久久| 色青五月天| 久久综合网免费视频| 99re这里只有精品视频了| 成人综合AV| 丁香婷婷久久| 国产色五月| 夜夜爱网站| 五月婷婷啪啪网| 五月婷婷激情网| 欧美精品A片一区在线观看| 久久五月天婷婷视频| 丁香五月亚洲综合| 2025天天日爽| 香蕉久久国产AV一区二区| 成人网站av免费网站推荐| 色婷婷婷综合五月天| 五月天婷婷激情| 香蕉网婷婷| 久久久宗合| 丁香五月天的网址。| 91蜜桃婷婷狠狠久久综合9色| sewuyuetingtingiii| 天堂久久精品| 99惹精品视频| 色色a| 人妖色AV色综合| 五月婷综合性中心| 99re这里| 五月丁香花激情综合网| 99久久99热| 色五月综合网| 色色色色色色色色五月先| 中文AV网站| 激情精品久久| 丁香六月婷婷久久综合| av超碰在线| 97亚洲色 torrent magnet| 狠狠操狠狠操AV| 丰滿爆乳一区二区三区| 思思99精品视频在线观看| 99热热这里只精品996小说| 亚洲V国产V欧美V久久久久久| 婷婷激情综合网| 免费视频无码| 99在线综合视频| 9久热这里只有精品| 丰满少妇乱A片无码| 97在线刺激| 国语精品探花| 婷婷五月丁香综合亚洲| 婷五月天在线草| 91色五月| 久久久久亚洲AV成人无码电影| www,天天干| 超级碰 久久9| 亚洲激情高潮| 久久五月丁香| 99在线观看视频免费| www.久久99| 99综合久久| 色情五月停停丁香| 婷婷五月丁香国产| 99re这里只有精品在线观看| 欧美电影在线观看| 五月婷婷六月爱| 午夜天堂一区人妻| 午夜九九九九九九九九九九九九九| 久青草影院| pom538精品视频| 美欧成人视频| 欧美久久久久久久久中文字幕| 99小精品| 中文字幕无码人妻少妇免费视频 | 天天操天天操综合| 色综合色色| 日本色色色| 思思久久精品| Av性爱网| 国产偷人爽久久久久久老妇APP| 激情五月无码| av中文网| 五月丁香婷婷六月天| 操碰色一区就去操| 一级操逼内射在线视频| 午夜色丁香| 婷婷亚洲欧美丁香五月| 成人丁香五月婷| 狼人狠狠操| 99碰碰| 色情综合网| 五月丁香久久激情网| 日本久久色| 色小说五月婷婷| 51精品国内探花| 天天五月情| 五月天丁香久久综合| 亚洲va欧洲va国产va不卡| 五月叮香啪| 激情丁香社区| 亚洲成色综合网站免费观看| 九月激情婷婷丁香| 亚洲激情五月天| 成人免费视频一区| www.99久久久| 天天操夜夜夜夜爽| 婷婷五月天社区| 久久久久久久丁香五月天婷婷| 婷婷五月天福利| 美日韩成人| 亚洲乱码日产精品BD| 99操逼| AV在线观看网站| 粉嫩AV久久一区二区三区| 99热12| 91精品国产99久久久久久天美| 超碰色色综合| 色婷婷成人| 天天插天天插天天插天天插| 26uuu亚洲色| www.无码com| 这里只有精品视频| 日日舔夜夜操| 日韩啪啪视频| 成人久碰| EEUSS鲁片一区二区三区| 九九色播五月丁香| 97视频.干com| 岛国av网| 天天日夜夜欢| 亚洲婷婷五月天| 婷婷丁香激情五月天色色| 五月天婷婷情色| 国产毛片欧美毛片久久久| 九九在线精点品| 五月激情视频| 五月婷婷久草| 久久A区B区| 五月天丁香综合在线| 67194国产| 天天日综合| 干婷婷五月天| www.99精品在线| 日韩成人网站精品久久大全| 一区二区乱视频码| 另类综合婷婷五月天欧美视频| 4399在线观看免费高清黄色视频| 五月婷婷色| 性色天| www.狠狠狠.com| 99热精品观看| 激情亚洲五月| 99色五月| 激情综合色| 色综合久久久无码中文字幕999| 五月花综合视频| 久久久久久草黄色片AV在线观看| 小色小蛇伊人婷婷色香五月| 亚洲精品V天堂中文字幕| 欧美va视频| 日日夜夜爽| 亚洲在线激情婷婷五月| 中文色婷婷| 九九热精品视频| 欧美激情2025| 五月婷婷色播视频| 操日视频| 久热精彩视频98| 国产精品人成A片一区二区| 五月婷啪啪| 五月婷婷深爱六月| 五月丁香综合激情网| 日本V在线观看不卡视频网站| 99九九久久| 看片视频在线免费日产在线看| 蜜乳国产网站| 99小精品| 深爱五月月天| 在线视频另类| 五月亭亭色| 五月天激情小说| 夜夜爱网站| 99r这里| 天天日夜夜操五月| 亚洲第一色网站| 婷婷色色五月| 9l视频自拍九色9l视频自拍九色9l社区 | 色色色图| 秋霞电影理论| 超碰在线91| 色婷婷五月丁香色| 无码视频国内精品久久久| 亚洲激情网| 丁香六月婷婷| 九九人人操| 日本系列_4页_777FP| 激情欧美丁香五月| 天天操夜夜爽歪歪| 高清激情av在线观看| 综合激情在线| 丁香狠狠色婷婷| 婷婷丁香五月天影院 | 色狠狠婷婷| 99热爆在线| 99在线观看| 亚洲欧洲另类| 淫视馆aV二区一区| 五月丁香狠狠爱| 婷婷精品| 99热这里只有精品99| 99热国内精品| 99激情网| 久久丁香五月天| 蜜乳国产网站| 五月丁香狠狠地噜噜噜噜| 99九九视屏| 丁香婷婷五月综合色情| 综合色、色综合| 国产熟妇乱子伦hd| 久操香蕉| 最近中文字幕大全免费版在线| 俺去也婷婷| 天天爽夜爽| 五月网在线| 直接看的AV| 久99久99精品免| 色播激情五月天| 天色综合网站| 色五月丁香六月婷婷| 丁香六月色婷婷| 五月天色婷婷综合| 色香久久| 玖玖资源在线视频| 日本啪啪天堂| 99热啪啪| 狠狠一日| 日本97久久久精品| 九色PORNY自拍成人精彩视频| 人妻久久久久| 五月www| 狠狠五月天婷婷| 五月激情小说| 婷婷五月av| 五月丁香婷成人网| 性爱激情小说AV五月丁香花| 亚州日本欧州韩美高青高潮一| 日韩色色小视频| 久久这里只有国产视频| 天堂久久性| 极品少妇XXXX精品少妇偷拍| 天天视频精品9| 久热AA| .操區COm| 婷婷五月天激情五月天| 五月婷婷日| 外国碰视频网站97| 99在线精品观看99| 成人综合网站| 91精品国产色猫| 午夜成人AV在线| 伊人六月丁香婷婷| 九九99久久| 99热综合网| 另类婷婷五月天啪帕帕| 色婷婷久久综合久色综| 狠狠综合网| 欧美性猛交99久久久久99按摩| 丁香五月天堂网| 玩熟女五十AV一二三区| 久久婷婷亚洲无码一起| 色婷婷五月六月丁香综合视频| 久久人妻高清中文| 婷婷无码五月天| 婷婷伊人综合中文字幕| 色情五月婷婷| 少妇人妻丰满做爰XXX| 天天综合91入口| 天天爽天天日人人爱| 久久综合五月| 激情AV在线| 午夜亚洲AV日韩无码| 日韩99视频| 婷婷五月天免费| 国产精品久久..4399| 丁香五月激情图片婷婷| 夜色五月天| 日本久久高清| www.成人婷婷综合| 婷婷在线视频| 人人操操| 丁香五月天啪啪激情综合网| 亚洲五月天婷婷| 九九热内射| 国庆精品久久| 类似婷婷激情综合网站| 人妻日日日| 97欧美在线| 99操逼| 日韩好吊操| 亚洲婷婷基地| 婷婷丁香熟女| 国产精品日日躁夜夜躁| 婷婷 激情 五月| 伊人久久99| 丁香五月婷婷欧美成人色图| 国产视频久色| 激情综合婷婷| 五月丁香婷婷色| 99热只有精品在线| 婷婷网五月| 9久热| 我爱大香蕉| 九九综合| 超碰成人在线免费观看| 99成人精品六| 欧美性爱一区| av亚洲国产小电影| 97色碰碰公开视频| 中文不卡一二三区| 天天干电影| 猫咪伊人久久| 五月丁香六月婷婷姐| 无码人妻AV久久久一区二区三区 | 嫩BBB搡BBBB榛BBBB| 狠狠干综合网| 激情五月六月婷婷| 丁香五月大香蕉在线99| 色综合色综合婷婷热| 四色五月婷婷| 欧美日韩成人| 久久婷婷人人| 色狠狠色综合| 五月婷婷色欲| 久久久中文| 伊人久久大香蕉网| 荷兰av一级| 亚洲欧美国产A片免费观看| 色99热| jiujiuxiangjiaowang| 五月婷婷丁香av| www.ywav| 丁香六月伊人| 狠狠色九月| 久热这里只有| 欧美色图天堂网色| 超碰日日操| 9久久婷婷国产综合精品性色| 五月天堂婷婷| 91日韩在线| 天天操夜夜夜拍拍拍| 99ri6在线视频| 99惹| 亚洲天堂婷婷丁香| 思思热再线视频| 1024欧美看片| 丁香六月欧美| 色婷婷色九月| 日韩成人电影AV| 婷婷丁香视频在线观看免费 | 狠狠做深爱婷婷久久综合一区| 99亚色色色| 国产成人精品123区免费视频| 艾小青av| 久久精品噜噜噜成人A∨色欲| 99热99美国在线观看| 丁香色色网| 久久思思热| 五月丁香婷在线| 丁香五月天天| 久久色情| 日日干日日s| Y11111111111少妇电影院| 五月天婷婷综合网| 婷婷久久综合久| 精品无码久久久久久久久| 婷婷六月花| 丁香五月色网| 97久久久| 天天摸天天日天天舔| 超碰97免费在线| 五月婷婷AV| 成人婷婷深爱综合网| 野外99热| 日日综合网| 久99久热只有精品国产99| 91热手机在线| 欧美黄色AA片哗啦啦啦| 免费久久这里只有精品99| 99热亚洲综合| 99精品久久| 色了色综合| AV动漫不卡无码免费| 97香蕉碰碰人妻国产欧美| 色六月天| 97在线/亚洲| 久久人妻熟女一区二区| 久久婷婷五月天蜜桃| 色婷婷丁香五月天| 五月婷久久久久综合| 婷婷情色五月天| 狠狠狠人妻| 中文AV在线观看| 欧美成人精品A片免费一区99| 久久99激情丁香婷婷小说网| 伊人91| 玖玖九九9999在线观看视频精品| 日日噜狠狠| 丁香五月婷婷骚视屏| 亚洲精品亚洲人成人网| 国av网|