亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

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

Linux下CMake生成與鏈接庫:靜態(tài)庫動(dòng)態(tài)庫實(shí)戰(zhàn)指南 1. 從一個(gè)真實(shí)場(chǎng)景說起為什么你需要搞懂CMake的庫生成與鏈接如果你寫過C或者C大概率經(jīng)歷過這樣的階段一開始所有代碼都塞進(jìn)一個(gè)main.c或者main.cpp里編譯命令就是一行g(shù)cc main.c -o app簡(jiǎn)單粗暴能跑就行。但項(xiàng)目稍微大一點(diǎn)代碼量上來了你就會(huì)開始琢磨是不是該把一些通用的功能抽出來單獨(dú)編譯成一個(gè)庫這樣既能復(fù)用又能讓主程序的編譯速度變快還能把接口和實(shí)現(xiàn)分離別人用你的庫時(shí)只需要頭文件和二進(jìn)制文件不用關(guān)心內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。這個(gè)思路是對(duì)的但問題也隨之而來庫怎么生成生成之后怎么讓主程序找到它、鏈接它在Linux環(huán)境下CMake是目前最主流的構(gòu)建工具之一它跨平臺(tái)、語法相對(duì)清晰、社區(qū)生態(tài)好。但很多人在第一次用CMake生成庫并鏈接庫的時(shí)候都會(huì)踩一堆坑undefined reference、cannot find -lxxx、運(yùn)行時(shí)error while loading shared libraries……這些報(bào)錯(cuò)信息看著就頭疼。我自己在帶新人的時(shí)候發(fā)現(xiàn)大家最容易卡住的地方不是寫代碼而是構(gòu)建系統(tǒng)。代碼邏輯明明沒問題但就是編譯不過、鏈接不上。所以這篇文章我想把Linux下用CMake生成庫、鏈接庫這件事從頭到尾講清楚。不管你是剛接觸CMake的新手還是已經(jīng)用過但總是靠復(fù)制粘貼配置的老手我都盡量把每個(gè)參數(shù)、每個(gè)步驟背后的“為什么”說明白。文章會(huì)覆蓋靜態(tài)庫和動(dòng)態(tài)庫的生成方式、鏈接時(shí)的路徑處理、運(yùn)行時(shí)動(dòng)態(tài)庫查找、常見報(bào)錯(cuò)排查以及一些我在實(shí)際項(xiàng)目中總結(jié)出來的經(jīng)驗(yàn)技巧。你可以把它當(dāng)成一份可以隨時(shí)翻出來對(duì)照的操作手冊(cè)。2. 先搞清楚基礎(chǔ)概念靜態(tài)庫與動(dòng)態(tài)庫到底有什么區(qū)別在動(dòng)手寫CMake配置之前有必要先把靜態(tài)庫和動(dòng)態(tài)庫這兩個(gè)概念理清楚。很多人配置寫不對(duì)根本原因是對(duì)這兩種庫的鏈接機(jī)制理解模糊。2.1 靜態(tài)庫的工作方式與適用場(chǎng)景靜態(tài)庫在Linux下通常以.a結(jié)尾全稱是archive本質(zhì)上就是一堆.o目標(biāo)文件的打包集合。當(dāng)你把主程序和靜態(tài)庫鏈接時(shí)鏈接器會(huì)把靜態(tài)庫中用到的目標(biāo)文件直接復(fù)制到最終的可執(zhí)行文件里。這意味著最終的可執(zhí)行文件體積會(huì)變大但好處是它不依賴外部庫文件拿到哪里都能跑。靜態(tài)庫的生成過程分兩步先把源文件編譯成目標(biāo)文件.o然后用ar命令打包。在CMake里你只需要用add_library命令并指定STATIC類型CMake會(huì)自動(dòng)幫你完成這兩步。靜態(tài)庫適合什么場(chǎng)景我個(gè)人的經(jīng)驗(yàn)是小工具、嵌入式環(huán)境、需要單文件分發(fā)的場(chǎng)景以及你不想讓用戶操心動(dòng)態(tài)庫路徑的情況。缺點(diǎn)是如果多個(gè)程序都鏈接了同一個(gè)靜態(tài)庫每個(gè)程序都會(huì)有一份庫代碼的副本內(nèi)存和磁盤占用會(huì)重復(fù)。2.2 動(dòng)態(tài)庫的工作方式與適用場(chǎng)景動(dòng)態(tài)庫在Linux下以.so結(jié)尾全稱是shared object。它和靜態(tài)庫最大的區(qū)別在于鏈接階段只是記錄了對(duì)動(dòng)態(tài)庫的引用真正的代碼加載發(fā)生在程序啟動(dòng)時(shí)或者運(yùn)行時(shí)通過dlopen手動(dòng)加載。多個(gè)程序可以共享同一個(gè)動(dòng)態(tài)庫的內(nèi)存映射節(jié)省系統(tǒng)資源。動(dòng)態(tài)庫的生成需要編譯時(shí)加上-fPIC選項(xiàng)也就是位置無關(guān)代碼。這是因?yàn)閯?dòng)態(tài)庫被加載到內(nèi)存的地址是不確定的代碼必須能在任意地址執(zhí)行。CMake里用add_library指定SHARED類型時(shí)會(huì)自動(dòng)幫你加上-fPIC。動(dòng)態(tài)庫的優(yōu)點(diǎn)是節(jié)省資源、方便更新替換.so文件即可不用重新編譯主程序缺點(diǎn)是部署時(shí)需要考慮庫的查找路徑問題否則程序啟動(dòng)時(shí)會(huì)報(bào)找不到庫。2.3 兩種庫的對(duì)比與選型建議對(duì)比維度靜態(tài)庫.a動(dòng)態(tài)庫.so鏈接時(shí)機(jī)編譯鏈接時(shí)復(fù)制代碼運(yùn)行時(shí)加載可執(zhí)行文件體積較大較小部署依賴無外部依賴需要庫文件存在更新方式需重新編譯主程序替換庫文件即可內(nèi)存占用每個(gè)程序獨(dú)立副本多程序共享編譯選項(xiàng)無特殊要求需要-fPIC適用場(chǎng)景小工具、嵌入式、單文件分發(fā)大型項(xiàng)目、多程序共享、插件架構(gòu)選型的時(shí)候我一般遵循這樣的原則如果是公司內(nèi)部的基礎(chǔ)組件多個(gè)項(xiàng)目都會(huì)用那就做成動(dòng)態(tài)庫方便統(tǒng)一升級(jí)如果是給外部交付的單文件工具那就靜態(tài)鏈接省得用戶配環(huán)境如果項(xiàng)目對(duì)啟動(dòng)速度有極致要求靜態(tài)庫會(huì)略快一點(diǎn)點(diǎn)因?yàn)槭∪チ藙?dòng)態(tài)鏈接的過程。3. CMake生成庫的核心命令與參數(shù)詳解理解了靜態(tài)庫和動(dòng)態(tài)庫的區(qū)別之后我們來看CMake里具體怎么操作。這一部分我會(huì)把每個(gè)關(guān)鍵命令拆開講包括參數(shù)的含義和我自己在使用中總結(jié)的注意事項(xiàng)。3.1 add_library命令的完整用法add_library是CMake生成庫的核心命令基本語法是add_library(庫名稱 [STATIC | SHARED | MODULE] [源文件...])庫名稱不需要加lib前綴和.a/.so后綴CMake會(huì)自動(dòng)處理。比如你寫add_library(mymath STATIC math.cpp)最終生成的文件是libmymath.a。STATIC和SHARED分別對(duì)應(yīng)靜態(tài)庫和動(dòng)態(tài)庫。如果不指定類型CMake會(huì)根據(jù)BUILD_SHARED_LIBS變量的值來決定默認(rèn)是STATIC。我建議在項(xiàng)目里顯式指定類型避免因?yàn)榄h(huán)境變量不同導(dǎo)致構(gòu)建結(jié)果不一致。MODULE類型比較特殊它生成的是不會(huì)被自動(dòng)鏈接的動(dòng)態(tài)庫通常用于插件場(chǎng)景需要配合dlopen手動(dòng)加載。一般項(xiàng)目里用得少但如果你要做插件架構(gòu)就會(huì)用到它。還有一個(gè)細(xì)節(jié)源文件列表可以寫多個(gè)文件也可以用變量代替。比如set(MYMATH_SOURCES math.cpp advanced_math.cpp) add_library(mymath STATIC ${MYMATH_SOURCES})這樣寫的好處是源文件列表集中管理后續(xù)增刪文件不容易漏改。3.2 頭文件路徑與安裝規(guī)則的配置生成庫的時(shí)候通常需要指定頭文件路徑讓編譯器能找到你的.h文件。用target_include_directories命令target_include_directories(mymath PUBLIC $BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include $INSTALL_INTERFACE:include )這里PUBLIC的意思是這個(gè)包含路徑既用于編譯庫本身也會(huì)傳遞給鏈接這個(gè)庫的目標(biāo)。BUILD_INTERFACE和INSTALL_INTERFACE是生成器表達(dá)式分別指定構(gòu)建時(shí)和安裝后的路徑。這樣寫的好處是當(dāng)你的庫被安裝到系統(tǒng)目錄后其他項(xiàng)目通過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)庫LIBRARY對(duì)應(yīng)動(dòng)態(tài)庫RUNTIME對(duì)應(yīng)可執(zhí)行文件Windows下的DLL也會(huì)放到RUNTIME。這樣配置之后執(zhí)行make install就會(huì)把庫文件和頭文件分別放到lib和include目錄下。3.3 版本號(hào)與SONAME的配置要點(diǎn)動(dòng)態(tài)庫有一個(gè)很重要的概念叫SONAMEShared Object Name它決定了程序運(yùn)行時(shí)查找的是哪個(gè)版本的庫。在CMake里通過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開發(fā)用軟鏈接。程序鏈接時(shí)記錄的是SONAME也就是libmymath.so.1運(yùn)行時(shí)加載器會(huì)去找這個(gè)文件。這樣做的好處是當(dāng)你升級(jí)到1.3.0時(shí)SONAME還是libmymath.so.1舊程序不用重新編譯就能用新庫如果升級(jí)到2.0.0SOVERSION變成2舊程序仍然找libmymath.so.1不會(huì)因?yàn)榻涌诓患嫒荻罎?。注意如果你不設(shè)置SOVERSIONCMake默認(rèn)不會(huì)生成SONAME軟鏈接程序鏈接時(shí)記錄的就是完整路徑或者libmymath.so這會(huì)給后續(xù)升級(jí)帶來麻煩。所以只要做動(dòng)態(tài)庫就一定要配VERSION和SOVERSION。4. 鏈接庫的完整實(shí)操流程與參數(shù)計(jì)算庫生成好了接下來就是怎么讓主程序鏈接它。這一部分我按照從簡(jiǎn)單到復(fù)雜的順序把鏈接方式分成幾種情況來講每種情況都給出完整的CMake配置和操作步驟。4.1 同一項(xiàng)目?jī)?nèi)鏈接target_link_libraries的基本用法如果庫和主程序在同一個(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)。如果是庫依賴庫的情況比如mymath依賴mylog那mymath鏈接mylog時(shí)應(yīng)該用PRIVATE還是PUBLIC這取決于mymath的頭文件里是否暴露了mylog的類型。如果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 鏈接外部庫find_library與link_directories的取舍當(dāng)庫不在同一個(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ò)誤版本的庫。find_library是精確查找找到之后把完整路徑傳給target_link_libraries依賴關(guān)系明確排查問題也方便。如果庫有對(duì)應(yīng)的CMake配置文件比如mymathConfig.cmake那更好的方式是用find_packagefind_package(mymath REQUIRED) target_link_libraries(myapp PRIVATE mymath::mymath)這種方式能自動(dòng)處理頭文件路徑、庫路徑、依賴關(guān)系是最推薦的做法。但前提是庫的開發(fā)者提供了配置文件這個(gè)我們后面會(huì)講怎么生成。4.3 運(yùn)行時(shí)動(dòng)態(tài)庫查找RPATH與LD_LIBRARY_PATH的處理動(dòng)態(tài)庫鏈接成功之后編譯不會(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í)找不到庫文件。默認(rèn)情況下動(dòng)態(tài)鏈接器會(huì)搜索/lib、/usr/lib這些系統(tǒng)目錄以及LD_LIBRARY_PATH環(huán)境變量指定的目錄。如果你的庫安裝在/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)目依賴不同版本的庫容易沖突。第二種是在CMake里設(shè)置RPATHset_target_properties(myapp PROPERTIES BUILD_RPATH /opt/mymath/lib INSTALL_RPATH /opt/mymath/lib )RPATH會(huì)被寫入可執(zhí)行文件運(yùn)行時(shí)動(dòng)態(tài)鏈接器會(huì)優(yōu)先從RPATH指定的目錄查找。BUILD_RPATH用于構(gòu)建時(shí)INSTALL_RPATH用于安裝后。這種方式比LD_LIBRARY_PATH更可靠因?yàn)樗菍懰涝诙M(jìn)制文件里的不受環(huán)境變量影響。第三種是把庫安裝到系統(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)境下都能找到正確的庫。4.4 參數(shù)計(jì)算實(shí)例從編譯命令反推CMake配置有時(shí)候我們需要從手寫的編譯命令反推CMake配置或者反過來驗(yàn)證CMake生成的命令是否正確。舉個(gè)例子假設(shè)手寫編譯命令是這樣的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來查看CMake實(shí)際執(zhí)行的編譯和鏈接命令對(duì)比一下就能確認(rèn)配置是否正確。這個(gè)技巧在排查鏈接問題時(shí)非常有用。5. 常見報(bào)錯(cuò)與排查技巧實(shí)錄這一部分是我在實(shí)際項(xiàng)目里踩過的坑和總結(jié)出來的排查方法。鏈接問題往往報(bào)錯(cuò)信息很模糊但只要掌握套路定位起來并不難。5.1 undefined reference符號(hào)找不到的幾種原因undefined reference to xxx是最常見的鏈接錯(cuò)誤。原因通常有這幾種第一種是庫沒有鏈接上。檢查target_link_libraries里是否包含了對(duì)應(yīng)的庫庫名拼寫是否正確。注意CMake里寫的是mymath不是libmymath.a。第二種是鏈接順序問題。在Linux下鏈接器從左到右處理庫如果庫A依賴庫B那A必須寫在B前面。CMake的target_link_libraries會(huì)自動(dòng)處理依賴順序但如果你手動(dòng)用-l參數(shù)就要注意順序。第三種是C和C混合編譯時(shí)的extern C問題。C編譯器會(huì)對(duì)函數(shù)名進(jìn)行name mangling如果C代碼調(diào)用C庫的函數(shù)或者反過來就需要用extern C包裹聲明。這個(gè)坑在混合編程時(shí)非常常見。第四種是庫的ABI不兼容。比如用不同版本的編譯器編譯的庫或者C標(biāo)準(zhǔn)庫版本不一致都可能導(dǎo)致符號(hào)找不到。這種情況比較隱蔽需要檢查編譯器和標(biāo)準(zhǔn)庫版本。5.2 cannot find -lxxx庫路徑配置錯(cuò)誤的排查cannot find -lmymath表示鏈接器在搜索路徑里找不到libmymath.so或libmymath.a。排查步驟先確認(rèn)庫文件確實(shí)存在用ls看一下路徑對(duì)不對(duì)。然后確認(rèn)target_link_libraries里寫的庫名和實(shí)際文件名是否匹配。如果庫文件是libmymath.a那CMake里寫mymath就對(duì)了。如果庫文件是libmymath_core.a那就要寫mymath_core。再確認(rèn)搜索路徑是否包含庫所在目錄。用find_library的話檢查PATHS參數(shù)是否正確用link_directories的話檢查路徑是否拼寫錯(cuò)誤??梢栽贑Make里加message(STATUS MYMATH_LIB${MYMATH_LIB})來打印查找結(jié)果。還有一個(gè)容易忽略的點(diǎn)32位和64位庫混用。如果你的系統(tǒng)是64位但庫是32位編譯的鏈接時(shí)會(huì)報(bào)找不到。用file libmymath.a可以查看庫的架構(gòu)信息。5.3 運(yùn)行時(shí)找不到動(dòng)態(tài)庫三種解決方案對(duì)比前面提到了error while loading shared libraries的問題這里把三種解決方案做個(gè)對(duì)比方案優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景LD_LIBRARY_PATH配置簡(jiǎn)單立即生效環(huán)境變量污染多版本沖突臨時(shí)調(diào)試RPATH寫入二進(jìn)制不受環(huán)境影響路徑寫死遷移需重新編譯固定部署路徑ldconfig系統(tǒng)級(jí)生效所有程序可用需要root權(quán)限影響全局系統(tǒng)級(jí)安裝我個(gè)人的習(xí)慣是開發(fā)階段用LD_LIBRARY_PATH快速驗(yàn)證部署階段用RPATH保證可靠性如果是給系統(tǒng)安裝庫那就用ldconfig。5.4 常見問題速查表報(bào)錯(cuò)信息可能原因排查方法解決方案undefined reference庫未鏈接/順序錯(cuò)誤/extern C缺失檢查target_link_libraries和頭文件聲明補(bǔ)鏈接、調(diào)整順序、加extern Ccannot find -lxxx庫路徑不對(duì)/庫名拼寫錯(cuò)誤用find_library打印結(jié)果修正路徑或庫名error while loading shared libraries運(yùn)行時(shí)找不到.so用ldd查看依賴設(shè)置RPATH或LD_LIBRARY_PATHversion GLIBCXX_xxx not foundC標(biāo)準(zhǔn)庫版本不匹配檢查編譯器和標(biāo)準(zhǔn)庫版本統(tǒng)一編譯環(huán)境或靜態(tài)鏈接標(biāo)準(zhǔn)庫cannot open shared object file庫文件不存在或權(quán)限不足ls檢查文件檢查權(quán)限安裝庫文件或修改權(quán)限提示遇到鏈接問題時(shí)先用ldd查看可執(zhí)行文件的依賴關(guān)系再用nm查看庫里的符號(hào)最后用make VERBOSE1查看實(shí)際編譯命令。這三板斧能解決大部分問題。6. 進(jìn)階技巧讓庫更專業(yè)、更好用基礎(chǔ)操作掌握之后這一部分分享一些進(jìn)階技巧讓你的庫更容易被其他項(xiàng)目集成也更符合工程規(guī)范。6.1 生成CMake配置文件讓find_package開箱即用如果你希望別人用find_package(mymath)就能找到你的庫需要生成兩個(gè)文件mymathConfig.cmake和mymathConfigVersion.cmake。CMake提供了configure_package_config_file和write_basic_package_version_file兩個(gè)宏來簡(jiǎn)化這個(gè)過程。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)就能找到你的庫然后用target_link_libraries(app PRIVATE mymath::mymath)鏈接頭文件路徑、庫路徑、依賴關(guān)系全部自動(dòng)處理。這是最專業(yè)的做法也是開源庫的標(biāo)配。6.2 用Object Library減少重復(fù)編譯如果你的庫有多個(gè)目標(biāo)共享同一批源文件可以用Object Library來避免重復(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)庫和動(dòng)態(tài)庫編譯時(shí)間能省不少。這個(gè)技巧在大型項(xiàng)目里特別有用。6.3 編譯選項(xiàng)的精細(xì)控制與調(diào)試符號(hào)生成庫的時(shí)候編譯選項(xiàng)的控制也很重要。比如調(diào)試版本需要加-g發(fā)布版本需要加-O2這些可以通過target_compile_options來配置target_compile_options(mymath PRIVATE $$CONFIG:Debug:-g -O0 $$CONFIG:Release:-O2 -DNDEBUG )$CONFIG:Debug是生成器表達(dá)式根據(jù)構(gòu)建類型選擇不同的選項(xiàng)。這樣一套配置就能同時(shí)支持Debug和Release構(gòu)建不用手動(dòng)改CMakeLists。另外動(dòng)態(tài)庫默認(rèn)會(huì)導(dǎo)出所有符號(hào)如果你只想導(dǎo)出指定的接口可以用-fvisibilityhidden配合__attribute__((visibility(default)))來控制。這樣能減小庫的體積也能避免符號(hào)沖突。6.4 跨平臺(tái)構(gòu)建的注意事項(xiàng)雖然這篇文章主要講Linux但CMake的優(yōu)勢(shì)就是跨平臺(tái)。如果你希望庫能在Windows和macOS上也能構(gòu)建需要注意幾點(diǎn)Windows下動(dòng)態(tài)庫需要顯式導(dǎo)出符號(hào)通常用__declspec(dllexport)和__declspec(dllimport)可以定義一個(gè)宏來統(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)庫是.dylib安裝名稱install_name需要用rpath來配置CMake的INSTALL_RPATH在macOS下也適用但語法略有不同。這些細(xì)節(jié)在跨平臺(tái)項(xiàng)目里都需要注意。7. 一個(gè)完整可復(fù)現(xiàn)的項(xiàng)目示例說了這么多理論最后給一個(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 庫的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)庫檢查/opt/mymath/lib是否在RPATH里或者臨時(shí)設(shè)置LD_LIBRARY_PATH驗(yàn)證。7.5 用ldd和nm驗(yàn)證鏈接結(jié)果# 查看可執(zhí)行文件依賴的動(dòng)態(tài)庫 ldd /opt/mymath/bin/myapp # 查看庫中導(dǎo)出的符號(hào) nm -D /opt/mymath/lib/libmymath.so # 查看庫的SONAME objdump -p /opt/mymath/lib/libmymath.so | grep SONAME這幾個(gè)命令能幫你確認(rèn)庫是否正確生成、程序是否正確鏈接、運(yùn)行時(shí)是否能找到庫。8. 個(gè)人經(jīng)驗(yàn)總結(jié)與后續(xù)擴(kuò)展方向我在實(shí)際項(xiàng)目里用CMake管理庫的生成和鏈接最大的體會(huì)是配置要顯式依賴要清晰路徑要可控。顯式指定庫類型、顯式聲明依賴關(guān)系、顯式設(shè)置RPATH能避免很多“換個(gè)環(huán)境就編譯不過”的問題。另外盡早引入find_package和配置文件導(dǎo)出機(jī)制雖然前期麻煩一點(diǎn)但項(xiàng)目變大之后會(huì)省很多事。后續(xù)如果你想繼續(xù)深入可以研究這幾個(gè)方向用CPack打包庫的安裝包用CTest做單元測(cè)試集成用Conan或vcpkg管理第三方依賴以及用CMake的FetchContent模塊自動(dòng)下載和構(gòu)建依賴庫。這些都是在實(shí)際工程中很實(shí)用的技能等基礎(chǔ)打牢之后可以逐步嘗試。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷久久网| 久久婷婷电影网| 性久久| 欧美人妻另类在线| 欧美日韩国产中文精品字幕自在自线, | 江都AV在线| 99精品视频在线观看免费| 九久久精品| 色女网日韩| 国产亚洲日本精品在线| 日欧操屄视频| 二男一女成人A片| 成人五月天丁香激情综合| 伊人96在线| 99re3这里只有精品| 九九九九九九九精品视频| 亚洲制服aⅴ中文字幕| 女性91网站| 久久久久久免费电影| 爱欲AV| 五月丁香色综合| 性做久久久久久久| 人人妻人射| 亚洲精品中文字幕一区在线视频| 欧美亚洲尤物久久| 亚洲国产奇米影视久久| αⅴ天堂| 无码一区二区三区四区五区六区七区八区九区十区视频 | 91丰满| 精品久久艹| 中文字幕乱碼在线| 欧美性战999| 日韩内射视频| 熟女天天干| 青苹果影院男人的天堂| 欧美亚综合色图| 射丝袜高跟鞋99| 久久日韩毛| 日韩人妻精品久久久久| 欧美毛片在线网| www.狠狠操| 黄色AV影视| 一二三区在线| 久久久久久性爱片| 色九九九综合| 91蜜桃传媒精品久久久一区二区| 国产美女高潮视频| 97超碰欧美中文字幕| 97资源久久| 色综合天天爱去电影网| 精品午夜福利导航| 新久久AV| 亚洲欧洲网站免费观看| 1024香蕉视频| 人妻在线臀日韩| 国产专区路线| 国产1727欧美| 九月伊人中文字幕| 久久 国产 无码| 伊人丝袜美腿高跟在线观看高清 | 久久久久久性爱免费视频| 日日摸日日碰夜夜爽视频| av天堂电影网| 人人摸人人摸人人干| 开心五月激情网| 国产精品老熟女一区二区| 18精品一区| 日韩噜噜69| 色图四区| 亚洲欧美日韩免费电影| 欧美亚洲综合色| 精品176精品2| 伊人欧美大香蕉视频| 一起草三级AV电影在线观看| 日韩精品国产一区二区| 九色视频91| 天天看少妇| 日韩色图 一区二区| 欧美后入式| 亚洲天堂久久久久久粉红视频| 久久这里只精品免费福利| 亚洲欧洲综合成人av一区| 国产精品青草综合久久| 午夜福利久久久噜久噜久久综合| av2014 日韩在线中文字幕| 啪啪啪综合网| 国产精品免费视频不卡| 国模不卡一本二本三电影| 亚洲午夜蜜臀| 中文字幕在线观看永久| 狠狠操狠狠操操| 97在线视频观看网站| 五月天开心网| 在线色资源| 欧美精品69性爱| 去干网最新版| 天天摸夜夜操视频| 日本影视久久免费| 99re这里只有精品3| 欲香欲色综合天天伊人| 国产1769在线| 久久久国产精品亚洲精品| 亚洲综合首页| 国产原创精品| 友优传媒精品在线一区二区| 国产又操| 天天大干大香蕉| 国产无码高清操逼视频| 欧色性第一页| 99re公开精品免费视频| 午夜欧美神马久久久久| 香蕉国产精品麻豆亚洲欧美日韩| 97色伦欧美| 人妻第一页| 97人人模人人爽人人| 粉嫩小泬久久久一区二区| 亚洲小电影免费涩涩成人在线高清 | 日韩三级网址| 伊人国产成人av网站| 一起草精品人妻| 亚洲国产一级中文综合久久天堂在线免费观看| 日韩性爱小视频| 91天天爽| 2020国产精品| 夜夜躁狠狠躁日日躁av| 性色一线| 粉嫩av平台| www.四虎在线| 欧美少妇性爱网站| 后入式999| 久久精品欧美一区蜜桃| 一级aaaaa欧美中文字幕录像片| 91在线综合网| 午夜爽爽爽在线观看永久入口姬片| 九九热精彩视频| 家庭乱伦性爱av| 中文字幕欧洲有码| 色色操| 精品人妻一区二区三区视频在线| 淫妻综合网| 欧美性夜| 都市激情人妻一区二区青青操视频 | 青娱乐淫乱1314| 久久久999网站| 插入逼91| 天天草AV| 亚洲av在线免费观看| 91九色丨风韵犹存| 日本日日色视频| 无码精品久久久天天影视| 一区二区三区在线日韩影院观看| 超碰爽人妻熟女Av| 狠狠中文字幕| 91中文字幕在线观看| 91九色网| 免费福利视频中文字幕| 黄站在线免费观看| 91 国产丝袜在线放观看| 91精品微拍福利| 久肏视频字幕| 欧美后入视频| 天美传媒国产原创中文字幕亚洲欧美另类 | 免费网色网站| 大香蕉 222| 国产精品无码在线| 91国产操逼视频| 人妻无码视频一区二区三区久久| 乱人伦 国语对白:视频直接看| 日本一区二区亚洲综合| 久操免费观看| 日本五区不卡| 久久做97| 亚洲日韩AV视色| 乱伦色图网址是多少| 欧洲精品二区| 天天综合网~91综合网| 色鬼在线综合| 色情五月综合婷婷| 能在线播放的国产三级| 欧美自拍偷拍综合图片| 偷拍盗拍亚洲色图图片| 蜜桃一区二区三区| 精品一区二区三区最新| 色综合色综合网| 欧美亚洲尤物久久| 人人艹亚洲| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 91宗合网| 高颜值美女口爆高潮浪叫| 久久一二区四| 欧美综合自拍成人自拍第二十页| 骚日日av| 91 国产丝袜在线播放-百度| 99xav| www.色五月| 操我无码| 岛园激情| 亚洲无码一区二区三区三州| 黑丝自慰喷水网站| 天天看天天在线精品| 国产高清视频无码在线| 国产精品内射婷婷一级二| 大香蕉中文201| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 色哟哟av网址| 人妻无码一区二区三区久久99| 日欧美色| 中出后入| 老熟女91视频| 国产操操日韩三级黄| 人人操人人舒服| 久久久久久亚洲Av无码精| 亚洲欧美日韩免费观看| 一区不卡在线观看av| 97亚洲综合| 91无码西班牙视频在线| 欧美爆乳精品一区二区| 岛国网址国产| 人人摸人人叼| 免费观看欧美日韩操逼视频| 久久一二三四五六七八九区区区 | 超碰久久.com| 欧美91视频| 这里只有精品视频在线观看麻豆 | 欧美精品久久| 亚洲猛交| 性色AV蜜色av色欲av| 自拍偷拍第26| 久久99草| 久久久久久人体| 国产传媒日韩| 黄色片一区二区三区四区五区 | 午夜无码熟妇丰满人妻| 亚洲清纯综合| 熟女乱3伦999| 97人人操人人摸人人爱| 九月丁香婷婷| 亚熟hd视频在线| 夜夜嗨一区二区三区三州加勒比 | 97人人射| 国产污视频麻豆传媒一区二区| 加勒比性爱成人在线| 97日亚洲欧美| 欧美一区二区一级岛国大片| 亚洲啪啪性视频| 国产精品情侣啪啪| 欧美在线综合| 人妻另类 专区 欧美 制服| 久操凹凸视频| 97超碰美国| 天堂国产AV| 国产女主播视频在线观看| 在线不欧美| 人人 操人人 操人人| 日韩丰满熟妇| 国产AV人人 夜夜人人澡| 久久久久幕乱码| 日韩在线观看三级电影| 日本肉体xxxx裸交| 天天操美美| 大香蕉中文| JIZZJIZZ国产精品喷水| 久久AV无码1区2区3区| 激情另类激情| 免费看污网址| 99999国产精品| 无码av永久免费专区网站| www.天天干| 五毛骚逼极品美女怕怕| 国产福利电影| 人夜夜精品网站香蕉嫩草| www.av不卡中文字幕| 成人免费性爱视视| 久久久一区二区三区四曲免费听 | 无码天天操| 青青爽| 夜色综合| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 很很热性爱视频| 国产成自自拍在线观看| 高清无码久操视频| 中日无幕一二三四区| 国产91 丝袜在线播放 | 欧洲站一级二级三级h| 日韩黄片视频试看| 日夜久久久九九九久| 日韩猛交| 精品国产网站| 一级毛片电影免费看| 91欧美| 亚洲色婷婷综合久久一区二区三区| 欧美黄色大片在线观看| 91爱欧美| 欧美三级中文字幕hd| 四季AV一区二区凹凸精品小说| 五月丁香黄色网| 97综合在线观看| 久久大| 九九玖玖精品| 五月亭亭六月丁香| 国产久久日| 手机在线A片| 色吧5亚洲| 亚洲色图久久精品蜜| 91色欧美| 尻女朋友一夜| 人妻偷拍一区二区三区| 天天情欲宗合网| 乱伦日本色图AⅤ| 香蕉色网| 色婷婷香蕉| 91天堂网| 草久久久| 6080YYY午夜理论片在线观看| 性吧在线视频| 国产精品久久aV| 久久、1234| 日韩三级在线观看网站| 1区2区3区中文字幕日韩| 91午夜无码| 精品二区久久| 欧美日韩国第一区| 交换娇妻呻吟声不停中文字幕| 亚州熟妇精品| 人人操AV| 一二三四视频中文字幕在线看| 午夜后入| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 老女人碰碰在线碰碰视频| 午夜影美女日鸡鸡天天视频国产| 少妇无码999| 99999精品成人| 亚洲成人久久一区二区| 91色色网站| 熟妇高潮精品一区二区三区下载| 国产尹人在线视频免费| 三上悠亚在线毛片91| 岛国人妻少妇av在线观看| 国产一区二区在线电影| 俄罗斯及免费在线看| 偷拍色图| 亚欧美色| 亚洲污污网站| 91天天综合网,天天综合网| 天天做日日做天天欢。| 欧美性爱18观看| 草B在线| 天堂资源欧美| 日本午夜久久电影| 青娱乐亚洲自拍| 91精品国产一区三一| 97视频900| 麻豆久久视频在线地址| 国产av美女被艹的乱叫| 天天操夜夜操狠很操| 九九热精品视频六| 少妇人妻激情四射| 亚洲综合影片| 日本加靬比网站发布页| 97久久精品亚洲| 肉嘟嘟www视频在线观看高清| 国产色图乱伦| 久久二| 亚洲欧洲激情| 亚洲精品1区| 日韩 人妻 精品| 日韩97超碰中文字幕| 大香蕉综合在线| 手机在线视频国内精品| 九九热久久99精品re| 国产精品999aaa| 成人国产二区三区在线,男女精品。| 色妇91| 大香蕉欧美国产日韩高潮| 国产免费大片| 神马久久久久久久久久久久| 欧美色图亚洲色图成人在在线| 操操碰| 国产AV高清AV无码| 精品人人插人人操| 五月天婷婷基地| 激情久久久| 日本欧美一区二区三区免费| 色综合av男人天堂| 久久一区二区三区入口| 国产CHASE男男GAYGA 毛多色婷婷| av网站在线观看了| 色嗨嗨在线| 日本欧美亚洲高清在线看| 国产精品成人久久一区二区三区| 26uuu成人影片| 久久丁香久草综合网| 日韩性爱啪啪视频| 成人97人人超碰人人| 国产精品露脸在线观看| 国产中文字幕在线点播| 中国大陆国产高清AⅤ毛片| 中文字幕交换人妻| 国产免费一区在线观看| 国产精品色色| 91亚洲欧美色图| 天天干天天舔| 日本国产高清色www视频在线| av网页一区二区三区| hd成人一区二区在线| 99久久99久久综合| 久草综合京东| 国产第11页| 五月天欧美色图| 一区二区三区一亚洲中文字幕、综合区灬 | 亚州色阁| 超碰色老头| 日韩欧美福利视频看看| 在线看片国产精品每日更新| 亚洲成av人片色午夜乱码| 99精品无码| 熟啊v色欧美热| 亚洲精品黑丝| av毛片aaaaa免费看| 国产精品久久久久久无码红治院| 中文字幕黄色片| 久久人妻四季| 超碰综合97在线| 天美传媒婬乱| 亚洲成?V人片在线观看福利| 久久久98网站免费视频| 碰人碰碰人人开房人肉| 性无码专区2020| 97任你吞精| 国产suv精品一区二区四区999| 国产一区二区三区久久精品太古里| 精品无码一区二区三区| 好色综合| 久久亚洲av成人无码国产| 欧美人妻二区三区| 亚洲熟女综合| 久久久成人免费av电影| 国产9 9在线 | 亚洲| 五月丁香综合啪啪| 蜜桃传媒一区二区亚洲| AV有码在线| 搡老女人老妇女AAA一VU麻豆| 久久久久久亚洲精品不卡人乳| a片亚洲一本通视频| 蜜臀视频网站| 九九色热| 精品国产乱码久久久久久久| 国产女人高潮嗷嗷嗷叫小说| 精品91日日夜夜超清资源| 国产亚洲日韩在线三区黑人| 九月AV| 78精品| 秋霞曰韩R级| 美女干逼2| 天天色天天干天天爱| 嗯啊免费视频| 伊人骚琪琪亚洲天堂网站| 亚洲欧美在线观看2021| 欧美天堂亚洲电影院一区在线播放| 亚洲AV无码乱码| 中国亚洲呦女专区| 人妻天天爽夜夜爽2| 操逼www.| 伊人在线大香蕉视频久久| 大学生口爆吞精| 色呦呦、国产精品| 国产在线综合福利网站| 日本免费不卡二区| 亚州熟女乱伦| 91久久堂| 91成人精品在线播放| baiduhicn.com。| 免费av高清无码| 97色欧州| 综合久久六月久久婷婷| 亚洲,欧美,综合网| 五月天激情影院| 人妻激情视频| 天堂蜜桃无码视频一区二区| 少妇久久久久久久| 青青草十区九区爱夜| 偷拍 欧美 日韩| 今日头条成人一区二区三区四虎精品| 伊人网青青| 久久久久亚洲一区女同性恋中文字幕| 国产av又色又爽又黄| 啊啊啊啊啊啊啊网址在线观看| 日本成人A片网站| 嗯嗯啊啊好大好爽| 久热99| 亚洲春色一区二区三区| 久久久久久久久久久999| 亚洲 自拍偷拍 欧美| 午夜精品人妻二区三区| 五月天精品| 9色国产精品一区粉嫩| 久久精9| www.色操逼| 九九碰九九爱97超| 亚洲男人的天堂在线看| 成人电影一区| AV天堂国产| 欧美日韩黄片精品在线| 中文字幕av片| 色黄污美女啪啪啪免费网站| 中文字幕乱码人妻一区二区三区,99精品| 欧亚日本情色| 精品国产乱码久久久久久久久1| 99久久无码| 情色五月天网| 色婷婷丁香五月| 边做饭边操逼逼| 久9爱经典视频 | 精品人妻一区二区三区视频| 欧美黄片视频在线观看免费| 9久9久| 91精品人妻电影| 欧美亚洲天堂| 美女91网址| oumeisetu综合| 无码操逼网| 91啪啪| 怡红院亚洲怡春院av| 亚洲日韩av一区二区三区百合| 精品亚洲国产成人精品| 欧亚日韩一区在线| 日本道人妻久久久在线不卡色视频| 夜夜嗨AV一区天天| 牛黄色久午久| 国产精品极品美女视频| 久久性爱视频免费看| 91中文字幕在线观看| 日本欧美色| 中日无幕一二三四区| 国产伦乱91| 亚洲综合另类小说色区亚洲成av人片在www| 日韩内| 欧美第二页午夜| 欧美亚洲AN| 亚洲丝袜天堂| 天综合中文| 丁香五月激情综合| 自偷自拍的亚洲视频| 日韩中文字幕人妻视频| 国产精品一区二区久久精品| 香蕉人欧美综合| 欧美综合色,www| 欧美性Fer办公室秘书| 久久久久久久久久精| 国产天天看| 桃色六月天| 久热最新在线杭州| 亚洲第一男人天堂| 人人澡人人澡人人| 干妹子| 九九九九九九九| 丝袜色综合| 传媒免费一区二区三区| 嗯嗯啊啊视频一区二区三区| 妇女视频网站| 美欧老女人97| 午夜毛片高清免费不卡| 日韩中文字幕宗合在线| 中文无线日韩一区| 91中文字幕在线观看| 国产精品另类一区大香蕉| 天天综合站| 素人伊尹大香蕉免费下载视频| 国产精品电| 女人18精品一区二区三区| 国内精品久9| 美女高潮国产高清| 黑人免费福利视频| 在线一道啪| 国产精品自在线发布| 韩国三级理论在线| 人人操av| 久久亚洲不卡一区二区三区 | 国产精品久久久久久久久久久久| 97色碰| 日韩操p| 美国一区二区免费视频| 五月天婷婷影院| 欧美|91色综合| 欧美性,亚州色| 国产精品在线一区二区| 亚州综| 岛国黄片网站| 男女真人网18| 久久久久9久久久久| 国产丰满少妇久久久精品影院| 久久熟女久| 91美女片在线| 亚洲人体视频在线观看| 久精品无码av一区二免费国产在线观看 | 亚洲va综合va国产va中文| 97蜜桃综合| 啊啊啊啊啊啊啊在线| 日本久久超碰| 国产精品麻豆视频网站| 亚洲午夜免费狠狠干| 东京成人一区| 久热这里只有精品9| 久久精品 六十路 熟女 欧美| 大香蕉天天看妹子| 日韩青久久| 夜夜操美女| 99热99在线| 男人网站婷婷| 黄片视频观看| 激情第四色| 东京热大香焦| 国产福利电影| 欧美亚性天堂| 伊人网在线点播| 国产乱伦亚洲| 九一屌逼| 超碰免费人妻在线| 99碰碰| daxiangjiao你懂的| 精品无码一区二区三区色欲| 五月丁香婷婷综合| 国产九九九九九九| 人妻81p| 蜜桃视频精品一区二区三区| 少妇高潮九九九九| 午夜精品视频777| 91 亚洲情侣偷拍 久久| 香伊人在线| 亚洲人精| 国产精品操| AV中文在线| 天天操福利视频综合网站| 国产精品爽爽v| 亚洲永久AV无码精品秋霞| 日日夜夜免费| 99免费视频| 欧美丝袜亚洲| 综合一区中亚洲国产成人综合精品 | 日本不卡在线二区三区| 色婷婷六月| 麻豆天天躁天天揉揉AV| 天美麻花大全视频| 97chaopenrihan| 图片区小说区| 男人的天堂三级| 欧美性爱精品一区二区| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 亚洲第一黄色av网站| 久久99草| www…国产操逼| 亚洲 中文 欧美 日韩 在线| 留下AⅤ黄色片| 精品丰满熟妇人妻一区| 大香蕉综合| 97在线免费视频观看| 淫妻综合网| 91丨人妻丨国产丨丝袜| 久久蜜桃综合网| {男男暴菊gay无套网站| 97操在线| 色色婷婷丁香| 日本阿v天堂在线观看| 一起草三级AV电影在线观看| 男人天堂站| 性暴力欧美猛交在线直播| 蜜桃色院一区久久| 午夜国产成人福利视频| 久久久亚洲精品中文字幕人妻| 日韩啪啪啪啪啪| 狠狠婷婷亚洲中文综合久久| 欧美日韩大陆黑人少妇99| 在线综合色| 国产一区在线看| 中文字幕视频一区视频二区| 男人天堂黄片| 中韩中文字幕在线观看| 91老司机在线视频免费观看| 午夜一区二区三区国产| 97伦综合| 色狠人在线99| 亚洲日本韩国在线| 激情小说图片亚洲首页| 97久久天天综合色天天综合色电影| 99热精品在线播放| 无码人妻精品一区二区三区99不卡| 中文字幕神马久久| 一区二区 韩日AV| 91人妻精华帖| 性色A∨91| 97网址97| 蜜色网色哟哟| 久久精品亚洲成a人天堂| 91丝袜在线观看| 九9热伊人| 美女啊啊啊啊啊啊啊| 亚乱色| 蜜臀久久99精品久久久电影| 99国产精品自在自在| 东北黄色电影| 国产免费永久精品无码| 免费自拍三级综合| 久久国产乱子伦精品免费女,网站| 欧美夜夜骑视频| 2001天天操| 91人人臊| 久久91精品国产9丨久久分亭| 国产综合久久久麻桃个| 果冻传媒一区二区三区| 色老汉色| www.狠狠干.coom | 亚洲双插| 中文字幕一区二区三四五区日日骚| 黄色AV影视| 操逼网站地址| 夜间福利片1000无码| 尤物av网站免费在线播放| 久久老熟女| 淫穴高潮色图| 日韩 欧美 国产 麻豆| 黄总AV色图| 97色插| 欧美色图天堂在线| 激情五月综合| 九九黄色网| 精品国产国产AV| 韩国女主播青草福利视频| 丁香五月婷婷基地| 婷婷五月天AV| 超碰91在线| 日韩性爱播放| 性做久久久久久免费观看软件| 国产精品久久久久久无码红治院| 被男人吃奶很爽的毛片| 久久免费99精品久久久久久| 日韩熟女三十乱伦| 69视频入口| 女人天堂av在线播放| 97国产人人| 久久久久亚洲| 天堂v无码免费视频| 91操熟女| 日韩熟女操逼| 在线看的av| 26uuu性| 狼狼色丁香久久婷婷综合五月 | 亚洲日韩XXX| 97视频在线免费播放| 91N综合网在线| 人人操人人精品影片| 久啪视频| 97av在线观看| 亚洲天堂男人| 黄人人操人人操| 免费一级黄色录像影片| 91操人| 婷婷五月天色色| 欧美亚洲综合色| 久久国产视频专区一二三| 日本97久久久精品| 久久精品中文字幕女同| 久久久三区二区一区| 网友自拍第1页| 欧美国产精品久久九九| 久久riav中文精品| 不卡免费av在线播放| 久久极品伊人| 淫乱图区 | 99超级碰免费视频| 偷拍网站久久男女男| 亚洲AV无码久久精品蜜桃小说| 麻豆天美在线喷水AV| 992视频一区| 狠狠久久手机视频精品| blacked精品一区国产| 9久久精品| 台湾肥佬网一区二区三区| 欧美天天综合站| 亚洲男人的天堂va亚洲男人社| 国产拍偷精品网站| 艹比视频国产精品| 日韩有码免费视频| 欧美熟女丝袜| 97免费在线| 中国东北熟女老太婆内谢| 国产精品色色| 亚洲精品1区| 啊啊啊啊操死我| 欧美大香蕉专区网| 青青草自拍视频在线播放| 天天日美女的B| 999久久久| 久久一区二区三区入口| 国产农村妇女精品一二区| 天天综合网视频91| 26uuu欧美日韩| 熟女精品一区二区三区| 超碰在线第一页| 狠狠操使劲操| 日韩婷婷| 中文字幕乱偷人妻久久艾草网| 亚洲色图 欧美| JULIA一区二区三区在线播放| 亚洲码和欧洲精品激情系列| 中文字幕欧美精品亚洲日韩蜜臀| 国产在线视频二区| 国产精品老熟女一区二区| 亚洲人人夜夜澡人人爽| 日婷婷| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 欧美真人抽搐一进一出gif| 五月天综合在线| 精品久久9| 高潮毛片无遮挡高清免费| 精品国产一区二区三区av在线资源| 韩日自拍| 无码逼| 伦理弟一页| 日本高清视频xxxx| ,国产乱人伦精品一区二区三区| 久草电影网| 国产一级作爱毛片| 日本男人插女人的逼黄色| 张柏芝国产一区在线观看| 丁香五月色情| 日韩大香蕉AV影片| www久久99| 亚洲色欧| 日韩啪啪网| 青女偷拍网| 天天插天天操| 欧美三级偷拍| 国产欧美日韩在线不卡第一页| 无码操逼天堂| 国产中文字幕曰本毛片| 加勒比av网| 久久人人爽人人爽人人片Ⅴ| 欧美日韩中国x| 图片区小说区| 日韩射图| 九九色综合| 超碰91在线| 亚洲天堂色图| 欧美性生活男人的天堂| 色天使大香蕉| 亚州免费啪啪视频| 国产丝袜高跟美女av免费观看| 国产树林里野战在线看| 色噜噜人妻av中文字幕| 六月婷婷激情| 国产精品人妻无码久久久老鸭窝| 九九九综合精品| 日韩视频精品在线观看| 日日夜夜噜| 成人美女av| 九久久精| 成人AV素股で擦久久| 日韩福利综合一区| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 羞答答AV中文字| 激情深爱五月天| 午夜精品久久一区二区| 熟妇高潮一区二| 5278欧美一区二区三区| 天天干18禁| 蜜桃视频一区二区三区在线观看| av天堂天堂av日韩| 秘书高跟黑色丝袜国产91在线| 大香蕉亚洲中文| 91东京热男人的天堂| av草草在线电影| 美女尤物福利视频| 国产91啪| 男人的天堂2019| 久久精品视| 污啪啪啪视频| 一起草日韩| 欧美97色| 国产一区二区久久| 92福利社视频| 熟女五十路一区二区三| 蜜臀AV一区二区三区| 2017大香蕉| 色在线69堂| 99无码| 一级aaaaa欧美中文字幕录像片| 亚洲精品电影| 亚洲国产精品久久久男人的天堂| 女人高潮大叫一级毛片| 欧美高清无码免费视频高清版| 91老熟女91老女人| 欧美 亚洲 大香| 久久久五月天| 日本免费专区| 亚洲天堂精品日韩电影| 久久久久久免费电影| 色老汉色| 嗯嗯嗯好爽| 在线性黄高清免费视频| 成人性爱AV在线免费观看| 人妻熟女一区二区在线视频| 日本最新免费韩国1区2区视频播放| A久久| 国产精品久久久久久片| 三级日本一区二区三区| 中国特猛少妇色xxx| 超碰97欧美日韩| 亚洲日韩青青草色月| 人妻熟女一区在| 日韩成人大片在线观看| 影音先锋视频在线| 国产日韩无码一区二区三区久久区| 久久久青青草| 亚洲在线观看| 色臀aV| 熟女高潮合集-永久久久-成人AV| 伊色综合天堂色97| 日日夜夜狠狠| 狠狠色综合网| 美女自卫慰黄网站免费| 国产综合网站在线播放 | 国产九区| 99色婷婷中文字幕乱色| 9热9热综合网| 99自拍B亚洲 | 天美欧美国产| 熟女欧美日韩综合婷婷| 中文字幕制服欧美久久一区| 欧美激情总合网| 一区二区你上我| 超碰97起碰| 国产丝袜视频| 日韩在线视频1234| 青青国产精品在线| 啊啊啊啊啊啊在线看| 青娱乐亚洲热| 97青青操视频| 第四色亚洲色图| 久婷婷一区| 91日产欧美| 日本一久是| 97人妻人人躁人人玩人人| 天天爽入口| 国产怡红院在线| 人妻丝袜二区| 懂色av一区二区三区天美传媒| 亚洲图片激情小说| 国产毛片毛片4p懂色| 国产家庭乱伦表演| 天天草夜夜草高潮片| 欧美日韩精品一区二区三区高清| 国语国产操逼伊人AV网| 久久久成人国产精品无码| 9999免费精彩视频| 大香蕉123| 亚洲男人天堂网久久| 久久久久久久久九九久孕交| 老女人碰碰在线碰碰视频| 另类成人首页一区| 久99在线免费观看视频| 婷婷五月天激情四射| 爱妃国产亚洲视频中文字幕| 日本免费中文字幕在线| 国产激情av女片自拍| 日本天天色| 97中文字幕色| 亚洲情色综合网| 天天综合网在线观看| 超碰在线人妻中文字幕| 国产区性爱在线视频秋霞豆| 色优久久| 欧美日韩大陆黑人少妇99| 无码九九| 国产精品视频内谢女人| 国产一区二区三区久久久精品| 国产大学生高潮在线播放| 日韩偷拍色图| 精品乱码在线观看| 九九草| 精品高清一区二区三区三州| 91精品久久久久久综合五月天| 天天操女人| 日本天堂在线播放| 欧美亚洲自拍另类人妻| 啪啪啪精品视频| 久久久999日本大片| 男人把坤坤插入女人的下体| 欧美色网络| 成人一级性爱| 成人婷婷丁香| 97免费视频在线观看视频| 精品人妻一区二区免费蜜桃视频| 欧美日韩在线国产在线| 天堂av2019| 激情婷婷丁香网| 黄色片一区二区三区四区五区| www.zbzhongsen.com| 99色婷婷中文字幕乱色| 97欧美日韩| 婷婷深爱五月| 亚州春色| 国产一区二区三区高清视频| WWW黄片COM| 九九九九九用不成了| 999综合网| 99久久综合网| Aa东京男人的天堂| 国产无码精品久久久久久| 性爱综合网| 国产AV天美传媒一区二区三区 | 亚洲影视第一页| 中文字幕人成乱码熟女香港| 日本有码久久| 这里只有97精品| 户外裸露刺激视频第一区| 国产丝袜美腿美女麻豆| 日本精品五区| 色婷婷丁香五月| 欧美肥臀在线| 全球成人中文在线| 中文一区在线日| 岛国在线免费视频| 嫩草 人人网精品| 熟女人妻精品一区二区视频 | 亚洲色图图片| 久久人妻办公室视频| 色香网| 午夜免费福利视频一区| 九九九九九九免费视频| 日本色色色视频| 亚洲熟女乱综合一区二区三区| 中文字幕日韩精品久久| 熟女自慰久久久| 91色人妻| 99热在线不卡| 中文字幕日韩专区精品系列| 一区二区三区四区五区高清无码永久视频 | 国产外初女出血视频| 温婉少妇玩3p| www.acm成人黄色毛片| 国产乱码精品一区二区三区四川| 久操视频免费观看| 久久久久国产精品喷潮免费观看臀 | 国桃视频产巨乳精品一区二区在线| 日韩免费三级黄片电影| 日韩激情视频| 久久国产乱子伦精品免费女人| 天天天天天天天天综合| 欧美精品日韩久久久九| 国产一区二区三区,在线观看观看| 国产欧美日韩一区二区三区| 试看60秒| www色色色com| 日日超碰亚洲| 欧美美女在线高潮999| 隔壁邻居波多野结衣中文字幕| 欧美成人色| 粉嫩av在线一区二区| 0755午夜福利视频| 激情文学网伊人| 欧美巨大性舒爽顶到了| 91天美传媒在线| 911粉嫩人妻| 2020中文字幕在线观看| 日韩精品人妻系列无码天堂| 福利社区午夜一区二区| 淫色网综合| av婷婷色网| 国产精品美女久久久久AⅤ国产馆| 后入式在线免费观看60秒| 特级毛片特黄久久免费看| 日本免费二区三区| 亚洲 欧美 91| 最新国内自拍av免费| 日本性一区| 天天影视色香色欲| 6080YYY午夜理论片在线观看| 激情情色五月天| 欧美嗯啊……在线观看视频免费| 国产v片在线免费观看| 蜜臀久久精品久久久久视频| 丁香五月AV| 国产一区二区在线播放量| 国内一区二区三区| 91九久| 风流老熟女一区二区三区l| 91女色| 久操网在线| 日韩有码免费视频| 日本免费人成视频播放120秒| 色色97爱| 大香蕉综合久久| 日日干夜夜干| 国产福利在线视频网站| 密臀视频三区免费网站| 小草av不卡亚洲二区| 婷婷五月天补不补| 国产尤物AV尤物在线观看不卡| 国产品精品自在在线午夜免费 | 欧美色视频在线| 91成人无码| 午夜九九| 日韩9999| 116美女午夜| 午夜天堂啪啪| 18禁美女裸体无遮挡啪啪| 91亚洲色图| 99超碰网| 国产天美传媒精品| 东北黄色电影| www.婷婷六月天| 26uuu国产免费观看| 性色av大全| 91亚洲欧美激情| 在线 欧美 亚洲| 欧美影音在线| 欧美性,色九九| 日韩成人色图| 激情五月天丁香| 91精品无码人妻系列| 国产野战露脸在线播放| 婷婷伊人五月| 白嫩少妇| 午夜精品久久久久久久久久久久久| 亚洲精品国产熟女久久久| 亚州色图欧美| 另类av天堂| 欧美性爱一内片一区二区三区| 99re9在线| 啊啊啊操一区| 六月婷婷激情| 欧美成人精品A片免费一区99| 熟妇操花| 伊人色综合网电影| 国产极品一区二区三区三州| 久久riav中文精品| 三级AV入口| 久综合国内精品自在自线| 摸奶性爱视频网站在线免费播放| 九九九久久久| 极品国产内射| 欧美一区二区三区不卡高清视频| 亚州综合色| 91肉丝| 成年人黄色视频免费| 午夜啪| 日韩无码精品综合久久| 欧美日韩黄片精品在线| 成人小说视频在线精品欧美| 久久久久亚洲三级电影| 国产精品一区av在线| 国产中文大片资源中文字幕| 久久久久久久久久va| 欧美αv.com| 午夜影美女日鸡鸡天天视频国产| 国模无码一区二区三区在线| 久久久免费的精品| 大香蕉黄色一区| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 日韩无码a片|