久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(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é)尾全稱是archive本質(zhì)上就是一堆.o目標(biāo)文件的打包集合。當(dāng)你把主程序和靜態(tài)庫(kù)鏈接時(shí)鏈接器會(huì)把靜態(tài)庫(kù)中用到的目標(biāo)文件直接復(fù)制到最終的可執(zhí)行文件里。這意味著最終的可執(zhí)行文件體積會(huì)變大但好處是它不依賴外部庫(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)景以及你不想讓用戶操心動(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é)尾全稱是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í)行文件體積較大較小部署依賴無(wú)外部依賴需要庫(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)鏈接省得用戶配環(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ù)名稱 [STATIC | SHARED | MODULE] [源文件...])庫(kù)名稱不需要加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)榻涌诓患嫒荻罎?。注意如果你不設(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ì)傳遞給其他依賴myapp的目標(biāo)。如果是庫(kù)依賴庫(kù)的情況比如mymath依賴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避免不必要的依賴傳遞。這個(gè)PRIVATE/PUBLIC/INTERFACE的區(qū)分是CMake現(xiàn)代用法里很重要的部分用好了能讓依賴關(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依賴關(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ù)路徑、依賴關(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)目依賴不同版本的庫(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依賴庫(kù)B那A必須寫(xiě)在B前面。CMake的target_link_libraries會(huì)自動(dòng)處理依賴順序但如果你手動(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的話檢查PATHS參數(shù)是否正確用link_directories的話檢查路徑是否拼寫(xiě)錯(cuò)誤。可以在CMake里加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查看依賴設(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í)行文件的依賴關(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ù)路徑、依賴關(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安裝名稱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í)行文件依賴的動(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ì)是配置要顯式依賴要清晰路徑要可控。顯式指定庫(kù)類(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管理第三方依賴以及用CMake的FetchContent模塊自動(dòng)下載和構(gòu)建依賴庫(kù)。這些都是在實(shí)際工程中很實(shí)用的技能等基礎(chǔ)打牢之后可以逐步嘗試。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩三级视频一区二区三区| 人妻日日干| 亚洲人成网站7777| 国产女大学生AV| 久久久久久久人妻| 亚洲素人综合| 麻豆国产96在线| A啊啊在线观看| 国产精品国产精品国产| 国产 码在线成人网站| 欧美天天综合站| 人人喜人人妻| 亚洲色人妻综合| 久久婷婷视频| 九色在线熟女国产黑人| 亚洲精品欧洲精品| 美女黑人91神马| 婷婷五月天av| 青青草天天亲夜夜操网| 2000亚洲男人天堂| 日韩性爱啪啪视频| 色小视频蜜乳| 唯美清纯 妖精视频| 天天激情综合站| 成人看片网站| 欧美狠狠| 久久久久成人蜜桃精品| 高颜值美女口爆高潮浪叫| 人妻丰满熟妇一区二区三| 人妻少妇一区二区| 日本一级真人黄色性爱视频| 性色av一区二区| 欧美日日操| 日本九九久久99播| 深夜福利黄片| juliaann精品熟女一区| 97干在线| 日韩美女,国产传媒,视频一区| 97超碰日韩| 99久久99九九99九九九| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | se,,,亚洲欧美| 国产麻豆一级精品视频| 色妺妺AⅤ| 韩国一级做A片免费的| 91高跟美女在线播放| 91福利网在线观看| 东北操逼| 操91| 大香蕉一级黄色片久久| 人澡逼| 亚洲一卡2卡3卡4卡乱码网站| 99综合自拍| 蜜乳性色无码专日粉嫩骚逼AV| 欧美亚洲系列| 97香焦色区| 高潮毛片无遮挡高清免费| 亚洲图片偷拍欧美| 99.色网| 国产熟妇 码视频户外直播| 91欧美性| 婷婷五月天成人网| 又大又长又粗又爽又黄| 国产精品一区二区麻豆| 人妻天天操天天爽视频免费| 福利色色| 亚洲欧美色图片| 先锋音影AV| 极品极品色影院| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 久久久久久午夜男人的天堂| 26uuu久久| 插插综合网天天影视网| 99丝袜福利在线播放| 亚洲制服aⅴ中文字幕| 天天在线91| 国产黄a三级三级三级av在线看 | 男人的天堂VA| 色偷偷色偷偷欧美日韩| 久久免费看高潮毛片韩国| 大香蕉免费3| 9精品在线| 91黑丝在线播放| 人妻精品一区二区在线| 久操网视频| 激情综合五月婷婷| 天天操天天干一区二区 | 天天干天天做| 天天干天天狼在线视频| 亚洲字幕一区二区| 一级做a爰片性色毛片久久| 美日韩在线不卡人妻| 亚洲av在线免费观看| 顶级丝袜熟女一区二区三区| 都市久久精品激情亚洲| 白丝AV| 国产精品久久泡妞网站| 熟女熟妇一区二区三四区| 俞拍自拍| 欧美狠狠操| 色色激情| 粉嫩绯色AV一区二区在线| 久久久久国产精品久久久| 9997se| 十八禁一区二区无码观看| 又摸又舔在线观看网站| 婷婷国产精品九区| 亚洲国产精品久久久久婷婷青年| 亚洲无线码一区国产欧美国| 伊人久久综合影院| 国产高清吃奶免费视频网站| 色欲三区| 午夜寂寞欧美| 日韩成人精品中文字幕| 国产亚洲在线| 欧美后进式| 日本九九九九| 99久热| 黄色视频特级毛片| AA特级绝黄| 理论久久婷婷网8| 北条麻妃99精品青青久久| 欧美日韩亚洲电影| 日韩无码服务区| 国产自偷| 男人天堂新| 亚洲熟女人妻中文字幕一区二区| 色妇综合网| 久久夜嗨| 亚洲欧美一区二区不卡视频播放| 久久亚洲人妻| 久久久99999久网站| 射 色综合| 人妻aa| 无码聚合| 日日不卡av| 五月天精品| 日本 情色 1区| 超碰97亚洲| 亚洲精品国产精品成人| 影音先锋每日最新资源在线观看 | 亚洲图片色图欧美另类| 国产高清自拍视频| 大香蕉一区二区在线观看.| 激情抓乳插进去啪啪啪日韩 | 人人妻人人色一区二区三区| 亚洲天堂电影网99999| 97激情97激情| 1024亚洲中文字幕久在线看片你懂的 | www.91色| 超碰调教97| 久久九九一区二区三区成人| 97超碰中文| 国产97在线播放| 91欧美经典| 人人操人人摸人人骑| 人人妻人人爽 97人人看碰人免费公开视频 | 国产精品麻豆免费视频| 亚洲色 国产 欧美 日韩| 91操人| 亚洲1区| 国产av白丝| 天天干人妻| 少妇精品| av天堂精品久久| 91成人久久| 激情深爱五月天| 欧美性,亚州色| 少妇内射视频| 白丝被操91| 美女国产一区二区久久| 日产国产精品中文久久婷婷| 欧美丝袜美女电影一二三四区| 亚洲高清内射| 久久久久9999妇女| 欧美夜夜| 亚洲九月丁香| 最新亚洲风情电影| 婷婷涩嫩草鲁丝久久午夜精品| AAAA欧美日韩| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 区一在线观看| 91性情| 国产欧美日本亚洲精品| 狠狠狠狠狠干| 久久亚洲天堂| 一本大道不卡一二三区| 中文字幕88av在线| 亚洲人综合19| 精品中文字幕一区二区l - 百度| 亚洲人妻在线精品| 欧美十八禁在线看| 91色色综合| 大香蕉中文| 伊人网综合在线视频| 搡老女人老妇女AAA一VU麻豆 | 亚洲图片日本AⅤ欧美在线| 97精品综合久久| 丁香婷婷激情五月天无毒不卡| 美欧色综合| 顶级丝袜熟女一区二区三区| 91欧美美女日韩国产婷婷| 日本黄色精品| 亚洲成人久久美女| 人妻大香蕉| 久久黄片国产一区二区| 极品白嫩美女白浆成人福利在线看| 久久色激情一区二区三区| 青青草原av| 温婉少妇玩3p| 麻豆AV96熟妇人妻| 13小男生GAY自慰脱裤子| 伊人网综合在线视频| 99精品丰满人妻无| 12一15性XXXX粉嫩国产| www.狠狠干.coom| 青青久日| 欧美成人一区二区三区在线播放 | 天天看片麻豆| 成人a级高清视频在线观看| 一二三四免费视频| 欧美色图欧美| 操操碰| 91成人亚洲色图| 又大又长又粗又爽又黄| 六月丁操逼| 蜜乳AV免费观看| 96AV精品| 亚洲在线欧美| 天美国产精品| 69精品| 亚洲精品男人的天堂| 日韩在线观看AV| aⅴ日韩成人电影av在线免费看av大全| 骚熟女吞| 中国女人内射6XXXXX| 蜜臀久久久国产| 欧美成人性爱视频在线播放| 操逼精品视频| 一级久久久久久久久久久| 国产精品久久久久久久久久久久久久久久| 久久性爱精品一区| 97一区二压| 欧美人妻精品一区二区| 日韩一性一交一A片俄罗斯| 玖玖爱一区在线| 成人性爱av| 操死我了嗯嗯嗯| 日韩国产成人自拍视频| KK色在线影院| 精品国产一区二区三区av在线资源| 嗯嗯啊啊啊好爽| 婷婷丁香在线| 久久精品—区二区三区内射| 在线 亚洲 网爆 自拍| av在线播放国产一区| 欧美中文狠| 91碰超| 极品少妇久久久久| 超碰人人妻| 国产91福利小视频在线观看 | 久久亚洲熟妇在线视频| 成人免费不卡在线视频| 久久这里只| 一牛影视久久久一区二区三区| 国产av激情无码久久天堂| 日本精品久久久久久久| 涩五月婷婷| 日本成人免费一区二区三区| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 国产日韩手机视频在线| 亚洲 无码 有码 中文字幕| 丁香五月色情| 亚洲黄片免费在线播放| 中文字幕伊人| 欧美极品女人的天堂| 一区二区三区在线美女| 91熟女视频网| 操我啊啊啊啊啊| 日韩国产乱子伦App| 女人香蕉久久毛毛片精品| 久久欧美1卡2卡3| 天天干天天操天天干天天操| 色欧美亚洲| 久久久中文版| 91久久久久久| 一区二区三区黄色片a| 亚洲天堂另类| 抽插爽| 免费久久精品麻豆一区二区av| 男人的天堂va在线| 亚洲综合一| 91狠狠色丁香婷婷综合久久| 又大又长又粗又爽又黄| 97精品视频| 综合久久99亚洲人妻中文在线| 69精品人人人人| 黄色片,com| 热热色中文无码| 爱妻综合网| 日韩在线视频1234| 丁香激情网| 日韩欧美偷拍美女视频| 欧美亚洲综合色| 91人妻中文| 成人性爱免费播放| 香蕉视频精品亚洲一区二区三区在线播| 神马影院午夜福利久久久| 五月丁香影院| 天天做天天爱| 成年女人18级毛片毛片免费观看| 91精品亚洲内射孕妇| 国产精品久久泡妞网站| 亚洲第一男人天堂| 亚洲熟女乱综合一区二区三区| 精品少妇一区二区三区免费观看| 尤物一级在线免费观看| 精品性爱一二三区| 一级特级aaaa毛片免费观看| 91香蕉视频在线观看免费| 九九九九九精品| 蜜桃狠狠色伊人亚洲综合 | 96久久精品一二三区色欲| 无码久久亚洲高清,| 欧美熟妇精品黑人巨大91| 亚洲综合色在线| 综合网久久| 成人日本精品九区| 少妇被玩视频二三区| 1024人妻| 思思热在线| 国产超碰人人操| 亚洲 日韩 丝袜 熟女 变态| 午夜AV人气不卡| 家庭乱伦国产精品| 亚洲无码国产探花在线观看| 91在线免费精品视频| 诱惑网综合| 91少妇人妻| 99热这里都是精品| 深夜视频| 碰碰97| 天天操天天日天天干| 天天综合欧美综合| 天天天天天天天天综合| 91日产欧美| 97一区二压| 日韩视频小说在线观看| 校园春色综合香蕉| 另类欧美| 极品美女嘿咻| 男人天堂新| 日韩一级二级三级在线不卡观看完整| 欧美第二页| 欲香欲色| av爱爱爱| 久久‘黄片视频| 欧美日韩国产色图在线| 999在线电影香蕉| 欧美熟妇乱码在线一区| 亚洲精品国产精品乱码不卡| 97爱b| 久久精品中文| 中出20p| 91熟女丨老女人| 九九AV| 无码操逼视频一下| 久久亚洲精品成人av| 日欧操屄视频| 91九九九馒头| 欧美老妇曰批的视频| 丰满岳乱妇一区二区三区| 欧美十八禁网站| 日本福利二区视频| 黄色成品网站| 九九九九九九九九九九九九九九九女| 96超碰网| 免费的黄片有限公司| 黄色AAAAAAAAAAA大片| 日韩精品视频在线观看一卡二卡| 五月天偷拍| 免费的av网| AV在线资源| 国产熟码AV| 久久久久久久精| 日本色色视频网站| 99热最新| 女生自91网站| 91爱网| 强奸乱伦AV网址| 日韩一级片在线看| 香蕉一区二区三区在线视频| 福利大香蕉| 色婷婷一区二区三区久久| 大黄片做爱的大的| 亚洲精品一区中文字幕乱码| 久久久久亚洲精品| 国产97在线视频| 波多野结衣先锋影音| 狠狠操狠狠爱| 伊人aaa| 熟妇女伦乱视频| 日韩激情啪啪啪| 99精品视频在线观看| 中国黑人三级片网站上区| 高潮9999外国| 一牛影视成人片免费| 一区二区三区精品黑丝白丝酒店对鸡| 极品色电影院| 欧美极品美女aaaaaa级黄片| 美女自卫慰黄网站免费| 夜夜福利| 熟妇综合一区二区三区| 九九热超碰| 亚拍在线| 无码高清少妇久久| 亚洲欧美大香蕉| 日韩97视频| 欧美日韩国产一区二区小黄片大全| 亚洲精品人妻吞精av| 色婷婷综合久久中文字幕雪峰| 99精品无码| 国产精品亚洲高清在线| 嗯……啊…嗯嗯…啊…好舒服| 欧洲自拍第一页| 秋霞网—男女啪啪亚洲免费体验区 | 97玖玖超碰| 欧美加勒比| 色综合久| 亚欧美色图| 老熟妇一区二区三区…| 在线天堂999| 日本天天干天天操一区| 色99视频| 91精品91久久久中77777| 91啪啪视频| 熟妇无码视频三区| 成人欧美日超碰| 人人做天天爱| 亚州乱码中文字幕综合久久久| 97免费视频在线观看| 成人丁香五月| 精品在线78| 岛园激情| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 国产乱伦亚洲| 精品国产一区二区三区久久久蜜臀| 夜夜爽夜夜操| www.狠狠干.coom | 午夜小电影在线插入淫高潮| 欧美天天拍| 欧美中文综合| 91 手机在线播放 绯色| 超碰2017| 少妇蜜汁| 国产又猛又粗又爽又黄| 好好的日:com久久九九| 精品国产91av一区二区三区| 麻豆精品天美| 三级网色| 超碰吊日色| 爱射综合| 97综合网| 中文字幕免费观看| 精品人妻av在线播放| 成人久久久精品| 欧美亚洲另类在线蜜桃| 亚洲天在线| 综合色久| 亚洲色综合| 麻豆精品A片免费观看| 久久免费99精品久久久久久| 九九九精品色乱九九九| 极品色www影院| 日本欧美不卡| 欧美大香蕉97| 日韩精品亚洲专区在线影视| 久久精品国产亚洲粉嫩| 中文字幕视频在线观看一区二区| 久久精品久久久久久久久| 久久99精品九九久久久婷婷| 国产1769在线| 九九九九9999| 人妻在线大香蕉| 日韩av影片在线观看| 五月天婷婷社区| 久久天天摸| 天天躁日日躁AAAAXXXX国产| 成人区人妻精品一| 丰满人妻一区二区三区在线| 精品国产91av一区二区三区 | 97在线播放| 久久久亚洲精品电影免费看| 青青操综合网| 日韩一级二级三级| 亚洲AO在线| 26uuu国产免费观看| 天天狂操夜夜狂日| 久久久久久久久久久999| 国产精品岛国片在线观看| 亚洲一区二区三区婷婷| 青青草狠狠撸| www.狠狠干.coom| 男人高清无码一区二区| 国产99热| 美女让帅哥通她小鸡鸡| 色妺妺在线视频| 国产精品爽爽v| 亚洲久久久| 久啪| 高凊专区人人操| 国产高清精品福利| 亚洲欧美国产va在线播放频| 91男女| 亚洲狼狼干综合1| 久99久视频| 人妻啪| 伊人九九九| 欧美亚州色的图| 116美女午夜| 亚欧国产无码精品在线| 国产亚洲精品无码三区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 亚洲aV无码成人在线观看| 黄色免费网| 欧姜老司机| 亚洲 综合 第一页| 国产青视频| 精品精品精品| 天天性射网| 亚洲人妻熟妇三十三区| 夜夜嗨一区二区| 怡红院一区二区熟女人妻| 熟妇xxxxx性春色| 欧美亚洲综合高清在线| 欧美草草高清日韩视频| 国产视频小说| 动漫区日韩区欧美区| 夜夜中出国产| 狠狠狠狠狠狠| 五月天激情四射| 亚洲情色中文字幕一区| 91在线超高颜值国产| 免费AV中文网在线观看| 九九九九九九九九九国产精品| 久久后入制服| 午夜精品人妻二区三区| 久久精品人妻一区二区| 绑缚麻绳人妻寝取完整版| 中文字幕制服欧美久久一区| 极品白嫩福利在线| 按摩中文字幕| 顶级少妇BT天堂| 热天堂一区二区| 欧美美女自慰一区二区三区| 大香交伊人网| 96精品在线| 91无码中出人妻视频| 91中文在线| 成人看片网站| 婷婷五月天激情网| 国产精品久久久亚洲一区| 五月天婷婷综合| 狠狠操天天干| 中文啪啪视频| 天天综合网91入口| 日本一天色道久久久精品视频| 人人色人人射人人妻| 骚乳在线| 操操操操网黑人| 四虎国产成人精品免费一女五男| 一区中文字幕二区日韩| 亚洲激情色片| 国桃视频产巨乳精品一区二区在线| 久久久免费懂色| 日本道日本道中文字幕日本道最新日本道在线观看 | 久草五月| 日韩国语字幕| 嗯嗯嗯啊啊啊操的我好爽| 97大色网| 亚洲资源网| 国产热av| 亚洲综合网91| 91AV入口| 色官网色综合| 婷婷丁香五月激情啪啪| 亚洲影视综合网| 黄色二级片网站| 麻豆黄四叶草网站| 狠狠爱夜夜干| 哈哈操 大香蕉| 探花精品 一区二区| 国产成人无码a| 玖玖爱免费观看视频| 国产伦精品一区二区三区在线观| 亚洲少妇喷视频看| 91色噜噜狠狠| 日韩毛片9| 日日夜夜免费| 欧美另类精品xxxx| 丁香五月婷婷五月| 国产精品视频播放| 日日摸日日弄日日拍| 中文字幕在线观看网址| 盗摄女人妻在线| 99色在线| 小骚逼被操的爽不爽| 97在线免费公开视频| 超碰97人妻| 亚洲免费在线探花| 久久久爆乳翘臀一线天伦理视频| 白丝jkav| 国产搭汕a级片| 亚洲日韩在线a不卡99精品| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 伊人97色天使| 综合色久欲| 中文操逼字幕| 爱做久久久久久| 蜜桃久久久久久| WWW美腿丝袜香蕉中文| 天美传媒精品一区二区| 思思性爱| 国产一区二区三区高清视频| 日本理论在线| 日日橹狠狠爱欧美超碰| 欧美天天综合在线| 91快色色色色色| 久久久9品一区二区三区| 精久久久| av在线播放国产一区| 日韩啪啪啪啪啪| 啊啊啊啊啊好舒服视频| 欧美片第一页| 伊人久久88国产女| 亚洲久久东京热一二三四五区视频| 91老熟妇| 色色99| 美国三级日本三级久久99| jizz啪啪| 9久综合网| 亚洲影视高清第一页| 色黄污美女啪啪啪免费网站| 中文字幕日韩综合| 揉揉揉夜夜| 18禁超污无遮挡无码免费网| 人妻爽爽啪视频| 久久男人天堂| 久久久一区二区三区四曲免费听| 久久久精| 嫩草一区二区在线观看| 禁十八久久| 97亚洲精品| 国产一区在线播放| 麻豆天美传媒毛片| 久久精品性| 久久久久久久久久久久欧美日| 天天插网| 亚洲.欧美.丝袜.中文.综合| 97国产精选| 免费伦费视频在线观看| 加勒比AV网| 老熟女乱伦片| 精品大久久| 麻豆久久一区二区三区| 青青草操逼逼视频| 精品无码久久| www久久99| 爱丝福利| 国产小u女在线观看| 欧美日韩亚洲电影| 激情国产乱伦Av| 色超碰综合| 在线综合 亚洲 欧美中文字幕| 91色综合激情| 夜夜草我| 91美女在线视频| Sekablack无码一区| 一区=区三区视频| 天天看天天日天天操| 亚洲精品久久久久久久久豆丁网| 天天狂操夜夜狂日| 中文字幕人妻丝袜| 日少妇视频| www四虎| 久久精品国产Aⅴ| 精品网站9999| 欧美激情性久久久久久| 97国产天堂岛| 国产精品久久99日日| 久久久专区| 色官网色综合| 91精品国| 精品国产少妇高潮视频| 国产成年女黄特黄| 欧美一区二区三区大综合| 国产又色又粗又黄又爽| 国产精品第二页| 日本一区二区成人在线| 日日97| 99少妇精品视频| 欧美精品成人一区二区在线观看 | 激情国产乱伦Av| 成人资源中文字幕在线观看| 日本三级大片| yaouchengrenav| 成人在线视频一区| 日本在线激情一区二区三区| 天堂综合网| 97色诱| 成人性爱美曰韩| 97碰碰色| 久久久久久久国产| 日本在线不卡一二区| 免费成人自拍视频在线| 做爱福利视频一区二区| 免费一级毛片在线视频观看| 久久免费少妇| 啊啊啊啊啊啊啊啊啊啊在线观看| 国模精品娜娜一二三区| 神马九九| 日本中文字幕一区| 中文字幕在线观看丝袜| 国产一区二区三区免费视频在性观看| 芊芊操逼视频无码| 大香蕉手机在线| 超碰国产情侣自拍网| 日韩午夜精品一区二区三区电影| 久久久久久久97| 国产乱码精品久久久久久| 六月丁香久久| 日韩无码三级影院| 春色91| 日韩人妻精品中文字幕| 开心激情站| 国产精品亚洲一级av第二区| 男人天堂2030| 精吧天堂| 亚洲伊人久久精品狠狠在线| 亚洲Av无码成人精品国产| 久久精品国产亚洲5555| 激情内射| 天美精品一区二区三区四区在线观看 | 日韩av不卡在线观看| 国产91影院| 人妻喷水| 歐美性天天| 青青草自拍视频在线播放| 丁香六月东京热| 国产精品亚洲色婷婷久久久| 91精品久久久久| 色综合99999| 伊人成人情色综合| 激情深爱五月天| 夜嗨影院| 日韩在线性爱免费视频| 欧美人体性爱互联网第一页婷婷日本| 18禁久久| 97就爱干| 大香蕉啪啪啪啪在线| 青青草自拍视频在线播放| 久9视频| 乱伦av麻豆| 国产美女自拍AV| 久九色| 精品日日人妻| 亚洲日韩97| 91亚洲丝袜| AV在线资源| 97这里都是精品| 婷婷伊人一区| 亚洲天堂中文字幕无码男同| 色婷五月| 欧美性爱在线无码| 亚洲图片欧洲图片aⅴ| 天天做日日做| 中国一级特黄大片护士 | 人妻激情偷乱视频一区二区三区 | 久久婷婷色| 国产精品久久99日日| 1级黄色夫妻对换性交免费看| 思思热国产高清| 精品九九九九九九| 2020中文字幕在线观看| 中文字幕激情小说| 91性网| 亚洲色婷婷综合久久久久中文| 精品国产乱码久久久久久日本公司| 青青欧美| 嗯嗯啊啊日韩精品| 97网址97| 91国产丝袜美女| 丝袜天堂网| 蜜臀aV午夜一区二区三区| 在线免费试看60秒| 日日做夜狠狠爱欧美黑人| 日本蜜桃| 人妻素股| 亚洲色图欧美色图综合| 久久久免费高清中文视频| 大色网久久| 99热一区二区三区四区| 另类欧美色| 欧美91在线| 一级乱伦网站| 五十路六十路七十路熟婆| 国产一级137片内射麻豆| 中文字幕乱码人妻二区三区| 神马久久久久久伦理片| 国产欧美岛国精品一区| 日韩免费看黄片| 色小视频蜜乳| 日韩精品一二三四| 蜜桃中文字日产乱幕4区| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 大香蕉一线视频| 亚欧国产无码精品在线| 六月色婷婷| 久久色激情一区二区三区| 青青青青草av在线观看| 在线小视频| 99热在线只有精品| 精品亚洲| 曰韩精品视频一区二区| 美女国产一区二区久久| 亚洲成人在线播放| 麻豆久久久久久久久丝袜| 亚洲揄拍网| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 超碰精品97| 91操操操操| 手机在线中文字幕国产| 熟女突然公开看18禁影片| 99热精品在线观看| 欧美一二在线| avav青青草久久夜| 秋霞色色影院| av在线一区二区三区| 大香蕉乱伦视频网| 精品大久久| 五月天欧美色图| 亚洲自拍97| 97精品久久久久久久| 亚洲欧洲激情| 国产9区| 日韩乱中文| 屌逼传媒| 青青草日韩免费观看高清在线| 78m啪啪啪| 操逼日批| 五月丁香综合激情| 久久亚洲熟妇在线视频| 久久久亚洲精品中文字幕人妻| 五码视频在线观看| 色婷婷五月综合激情中文字幕| 天无日色综合| 少妇激情AV| 精品日韩人妻视频| 极品极品色影院| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 色香91| WWW.操逼.COM| www九九热| 日日干男人的天堂| 97干在线| 日韩女模中文造逼| 亚洲激情天堂网| 久久久久久久性爱| 日韩亚洲Av人人夜夜澡人人爽| 婷婷三区| 97神马久久| 久操网视频| 亚洲色图 欧美热图 清纯唯美 另类自拍| 91激情国产| 99re热有精品视频国产| 天天综合网一91网| 麻豆天天躁天天揉揉AV| 亚洲天堂中文字| 久久25| 美女久久久久久久久久久| 高跟丝袜AV专区国产| 夜夜騷av、一區二區| 亚洲日韩天堂| 亚洲另类在线观看| 日本黄色XXX| 国产中文大片资源中文字幕| 无码一区二区三区四区五区六区七区八区九区十区视频 | 精品妇女一区二区三区| 人妖欧美一区二区| 国产精品视频一区二区三区八戒| 粘花网06av视频| 91美女视频在线观看| 9久久精品| 熟女久久久| 欧美精品成人在线播放| 国产乱弄免费在线视频。| 欧美色人| 嗯嗯啊啊视频在线看| K8久久久久| 在线观看黄色电话| 九九九九免费视频| 青娱乐国产盛宴视频| 操一区| 熟女这里只有精品6| 91欧美偷拍| 人人模人人看| 91国产丝袜足交精品视频| 国产精品网址| 婷婷五月天成人| 久99在线免费观看视频| 免费人成?大片在线播放| 999熟女精品| 综合欧美激情网| 91色色综合| 国产精品探花视频| 97欧美色综合| 日韩性爱再线视频| 欧美第五页| 日韩成人网址| 精品人妻一区二区三区视频在线| 九九亚洲视频| 九九九九九九九九九国产精品| 婷婷五月天丁香花| 女优大全 - 91n| 日本有码影片下载| 91在线免费精品视频| 啪啪视频mP4| 青娱乐999| 91九九九逼| 韩日性爱av| 亚洲亚洲亚洲天堂天堂| 日本午夜久久电影| 酒色综合网| 精彩视频日韩| 久久久一区二区三区三州| 中文幕97| 欧美系列在线一区二区| 色哟哟av| 亚洲欧美精品91| 小说区 图片区色 综合区| 97香蕉人人乳| 人人操人人操草草| 青青久草| 欧洲免费一区二| 一本大道不卡一二三区| 人妻天天爽夜夜爽2| www.夜夜操| 夜夜骑夜夜操| 一区二区不卡| 操逼网站视频漫画国产| 嗯嗯啊啊啊好爽| 亚洲图片欧美制度| 操逼www.| 九九九999久久久网站| 91精品国产综合久久久蜜臀| 国产一区二区免费福利片| 色网综合网| 五月天成人综合| 亚州成人a∨| 日日日日做夜夜夜夜无码| 91n.欧美| 97精品一二区| 国产综合网站在线播放| 精品对白久久不卡| 美女91在线观看| 婷婷深爱五月| 襙一襙| 色偷偷超碰亚洲| 国产成人资源| 一本一道波多野毛片中文在线| 色与欲影视天天看综合网| 久久精品免费| 久久婷婷综合国际产色怕| 中文字幕乱亚洲美女精品一区| 久久精9| 婷婷五月天综合网| 国产中文大片资源中文字幕| 日本三级精品| 精品网站99999| 99激情| 精品成人动漫一区二区| 丰满人妻-区二区三区| 最新av在线| 先锋精品av色鲁| 亚洲国产精品无码AV在线| 综合网91| 久久亚洲日韩国产欧| 人妻精品综合中文字幕在线 | 好舒服视频| 久久久久成人蜜桃精品| 激情国产乱伦Av| 激情小说亚洲| 97中文综合| 欧美熟妇亚洲版| oumeisetu综合| 91|九色|国产熟女| 无码高清国产AV| 91超碰在线| av影院十区| 加勒比伊人综合| 中文字幕亚洲欧美在线不卡| 亚洲色久| 久久久久成人亚洲国产| 夜夜操美女| 久久久亚洲| 校园春色 亚洲| 久久久久斤小| 亚洲永久AV无码精品秋霞| 精品妇女一区二区三区| 日韩午夜啪啪视频| 亚一综合久久久久久久久久| 色欲天天综合久久久无码网中文| 中文字幕第7页| 97热视频在线观看| 伊人操操| 久操 高清| 嗯嗯,啊啊,国产精品| 婷婷五月天网| 91啪啪视频| 秋霞一级视频在线观看免费| 2019久久久久久久久福利| 秋霞一集毛片观看| 久久男人的天堂| 欧美乱欲| 60秒不遮不挡| 欧美伊人电影| 亚洲精品九九九九九九| 综合大香蕉美。| 老女人91| 风骚少妇视频中文字幕| 超碰1997| 精品成人女人久久| 天堂资源站| 一二三四视频在线社区中文字幕| 99天天超碰| 亚洲码和欧洲精品激情系列| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 欧美性爱一内片一区二区三区| 亚欧精品久久久久久久久久久| 99热超碰在线| 五月天开心网| 天天插天天插| 人妻熟女一区在| 亚洲国男人的天堂| 天天看综合网| 熟妇高潮一区二区免费视频| 97中文天堂| 日本不卡卡一区| 欧美18禁91| 综合激情97 | 婷婷色色五月天福利| 国产肏逼网站| 影音先锋每日最新资源在线观看| 国产又色又粗又黄又爽| 日本1区2区不卡视频| 免费黄色片。| 乱伦av国产| 激情五月天丁香社区| 色五月婷婷色| 爱爱动态120秒| 内射黑人| 色综合久久夜色精品国产天堂| 九九九九欧美| 色天天野狼综合社区| 黄色工厂这里只有精品| 91青青草| 日韩免费高清大片在线| 亚洲1区2区三区高清中文字幕| 亚洲图片欧洲图片aⅴ| 人人操人人狠狠操| 欧美图片偷拍| 91嫩草欧美| Julia Annxxxxx| 青青草一区二区高清无码视频| 国产久久久久久| 亚洲熟女乱色一区二区三区| 国产亚洲女v在线观看| 日韩中文字幕在线视频观看| 激情婷婷五月天| 有码人妻系列| 久久久精品一区二区| 亚洲 欧美 第一页 | 国产精品农村妇女精品| 啊啊啊好想要| 亚欧性爱无码| 色97综合中文字幕| 600国产精品视频| 欧州一区二区三区四区| 日韩一性一交一A片俄罗斯| 亚洲激情在线| 欧美色图天堂网m| 欧美黑人日韩少妇色情| 免费试看60秒| 中国zzijzzijzzwww精品| 激情综合五月| 97 视频在线| 新91视频.cmp| www.色吧5.com| 亚洲Av无码成人精品国产| 99热亚洲天堂| 久久久久久久久久久久欧美日| 亚洲综合网91| 久久久久久69国产一区二区| 亚洲日韩精品在线播放| 色诱中文字幕| 久久精品六区| 激情五月综合开心五月| 久操不卡视频| 夜夜狼人妻| 青青草在线视频播放器| 伊人网青青| 亚洲操操操| 亚洲高清少妇| 亚洲精品久久久久毛片A片拉屎 | 国产欧美日韩在线观看麻豆传媒公司| 男人久久精品| 欧美综合亚洲综合| 婷婷午夜成人色中色| 精品91摸| 丝袜美腿91| 加勒比在线观看一区二区| 加勒比大香蕉视频在线| #NAME?| 性欧美另类高清| 欧美日韩97在线| 国产黄色剧情影片麻豆免费播放| 黄色小视频日本txt| 黑丝91视频| 亚洲资源一区| α√在线| 青青草十区九区爱夜| 精品人妻一区二区三区四区| 色天使亚洲综合在线观看| 日韩乱码Av| 精品国产乱码久久久久久久| 一区操逼日比视频| 日本一区二区三区精品| 精品一区二区三区18| 日韩欧美成人性爱在线| av婷婷色网| 色综91| 欧美性爱精品一区二区| 欧美夜夜骑视频| 明星性猛交ⅹxxx乱大交| 色婷婷综合网| 亚洲成人AB| 国产AV激情无码久久无码 | 99热97| 亚洲毛片久久| 午夜福利成人免费视频| 免费超碰97久久| 日日插夜夜| 欧美白嫩在线放| 欧美精品69性爱| 精品人人| 超碰在线一区| 国产亚洲人妻综合日韩 久久| 91精品国产91久久久久久久久久久久| 亚洲 一区二区 自拍| 亚码人妻|