99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

CMake構建實戰(zhàn):從核心機制到常見坑,一次講透

CMake構建實戰(zhàn):從核心機制到常見坑,一次講透 干這行這些年每天繞不開的就是 cmake 構建這套流程。不管你是接手別人的 C/C 項目還是自己從零搭一個庫第一步幾乎都是看 CMakeLists.txt 寫得怎么樣。說實話cmake 的上手門檻并不高但真正用明白的人不多不少人停留在“能跑就行”的階段一碰到跨平臺、多目錄、第三方依賴就抓瞎。這篇東西不打算做成文檔式的羅列我更想以一個實際用 cmake 構建過不少項目的從業(yè)者身份把核心機制、常見玩法、以及那些文檔里不會寫的坑一次性講透。無論你是剛接觸構建的新手還是已經(jīng)在用但經(jīng)常被奇奇怪怪的 CMake Error 折磨的老手這篇文章應該都能給你一些參考。1. cmake到底解決了什么問題——先搞清它在構建鏈中的位置1.1 從手寫 Makefile 到 cmake 的過渡很多人的困惑從名字開始。cmake 不是一個編譯器也不是一個獨立的構建工具它是一個“構建系統(tǒng)的生成器”。換句話說你自己不直接干活而是把活派給底層的構建系統(tǒng)去干。這個底層構建系統(tǒng)可以是 Unix 平臺的 Makefile可以是 Ninja也可以是 Windows 上的 Visual Studio 工程。在沒有 cmake 的年代一個跨平臺 C/C 項目要同時支持 Linux 和 Windows你需要維護兩套甚至三套構建腳本Linux 下寫 MakefileWindows 下維護 .vcxprojmacOS 下甚至還要考慮 Xcode 工程。一旦代碼文件變了或者新增了目錄所有平臺下的構建腳本都要同步改一遍這幾乎是噩夢。我第一次真正被 Makefile 折磨到崩潰是在一個同時依賴 OpenSSL、zlib 和幾十個內部模塊的通信項目里。頭文件路徑、鏈接庫順序、編譯宏全部要手寫維護。某次為了加一個新模塊改了 Makefile 里的依賴關系結果漏了一個頭文件路徑編譯全過了運行時崩潰查了整整一天才定位到是構建腳本的問題。從那時起我就決定在新項目里統(tǒng)一用 cmake至少不用再為每臺機器的構建環(huán)境重復造輪子。1.2 cmake 和 makefile 的本質區(qū)別這里直接說結論。Makefile 是面向“當前這棵樹”的構建規(guī)則它告訴 make 命令如何編譯、如何鏈接、文件之間依賴關系怎樣。它是具體的、不可移植的。而 cmake 的 CMakeLists.txt 是更高一層的抽象它描述的是項目的結構與目標然后由 cmake 替你生成對應平臺的 Makefile 或 IDE 工程。用生活化的類比來說Makefile 像是你雇了一個工人你直接告訴他一磚一瓦怎么砌。cmake 則像是一個項目經(jīng)理你只告訴他這里要一棟樓、那里要一個花園具體用哪臺吊車、哪個施工隊由他根據(jù)現(xiàn)場情況去安排。兩者直觀對比一下對比項MakefileCMake位置構建規(guī)則文件生成構建規(guī)則的文件跨平臺能力基本綁定 Unix make支持 Makefile/Ninja/VS/Xcode 等多類生成器依賴管理手動維護內置 find_package、FetchContent 等機制IDE 集成差基本靠命令行VS、CLion、VSCode 都原生支持學習成本語法簡單但組織繁瑣入門容易進階需理解 target 與生成器表達式適合規(guī)模小項目、個人工具中大型項目、團隊協(xié)作、跨平臺這不是說 Makefile 一無是處它就是 cmake 的下游產物之一很多時候你還會直接讀到它。但如果你要新建一個項目或者維護一個需要長期演進的代碼庫選 cmake 幾乎是現(xiàn)在行業(yè)里的默認答案。1.3 構建鏈條中的兩個階段理解 cmake 一定要先分清兩個階段。第一個階段是配置階段。你執(zhí)行cmake -S . -B buildcmake 會讀取 CMakeLists.txt把里面的邏輯展開成一套具體的構建文件。這個階段會做很多“探路”工作檢查編譯器是否存在、檢測系統(tǒng)庫、嘗試編譯并運行一段小測試代碼來驗證某個特性然后把結果緩存下來。第二個階段才是真正的構建階段。你執(zhí)行cmake --build buildcmake 調用底層構建系統(tǒng)比如 make 或 ninja執(zhí)行實際的編譯和鏈接。這里不再需要 cmake 去分析你的 CMakeLists.txt它只是作為入口去驅動底層工具。這個“兩個階段”心智模型非常重要。我在實際工作中見過很多人改完 CMakeLists.txt 只跑cmake --build發(fā)現(xiàn)改動不生效然后開始懷疑人生。實際上改了 CMakeLists.txt 之后必須重新回到配置階段也就是重跑cmake -S . -B build或者讓 IDE 自動觸發(fā)一次重配置修改才會生效。2. 環(huán)境準備與第一個 cmake 工程2.1 各平臺安裝 cmake 的方法cmake 的安裝本身相當簡單但不同平臺有各自需要注意的地方。Linux 上最常見的做法是用包管理器裝。Ubuntu/Debian 系直接sudo apt install cmake。不過這里有個坑apt 源里的 cmake 版本通常偏舊。Ubuntu 20.04 自帶的可能還是 3.16 左右的版本很多新特性用不了。如果你的項目要求cmake_minimum_required(VERSION 3.20)甚至更高你需要先確認系統(tǒng)源的版本或者使用官方腳本安裝。我個人實踐下來更推薦用 pip 安裝pip install cmake。這個方案的好處是版本新、干凈、不污染系統(tǒng)卸載也方便。Windows 上直接去官方下載安裝包即可。另外也可以用winget install Kitware.CMake裝完就在 PATH 里不需要額外配置。macOS 上則是brew install cmake同樣沒什么坑。安裝完成后驗證版本用cmake --version能看到版本號就說明裝好了。這里提醒一句cmake 的版本策略很保守高版本生成的構建目錄可以匹配低版本的 cmake但反過來不行。所以如果團隊協(xié)作建議所有人在同一個主要版本線附近至少不要低于項目里cmake_minimum_required指定的版本。2.2 cmake-gui 什么時候用得上很多人看到 cmake 第一眼是 cmake-gui 這個圖形界面。它長得很樸素左邊一堆變量、右邊一堆按鈕實際上它就是配置階段的圖形化入口。你可以在界面上設定CMAKE_BUILD_TYPE是 Debug 還是 Release可以指定CMAKE_INSTALL_PREFIX可以勾選各種option定義的功能開關甚至可以手動添加CMAKE_PREFIX_PATH來告訴 cmake 去哪找某個依賴庫。那是不是新手就該用 cmake-gui我的看法是能不用就不用。原因很簡單圖形界面的操作不透明你點了一下“Configure”cmake 到底做了什么、生成了什么、為啥某個變量變成紅色 NOTFOUND它不會告訴你你也不容易記住。相比之下命令行操作直接、可復現(xiàn)而且這些配置步驟最終都能寫進腳本里讓整個構建過程自動化。但 cmake-gui 也不是完全沒用。當你在排查一個復雜的依賴查找問題時GUI 里能把所有緩存變量攤開來看比命令行一行行敲cmake -LA要直觀得多。我會在排查問題時才打開它專門看某個庫的路徑變量到底被設置成了什么。2.3 最小工程從零開始不整那些虛的直接寫一個能跑的 CMakeLists.txt。假設你的項目就一個單文件main.cpp那么 CMakeLists.txt 只需要六行cmake_minimum_required(VERSION 3.16) project(FirstDemo LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(demo main.cpp)逐行說下作用。第一行指定 cmake 最低版本如果本機版本太舊會直接報錯。第二行定義工程名并聲明語言只涉及 C。第三和第四行把編譯標準設為 C17CMAKE_CXX_STANDARD_REQUIRED設為 ON 表示這是硬性要求編譯器不支持就直接掛掉而不是打一個警告然后退回去用默認標準。第五行創(chuàng)建了一個名為 demo 的可執(zhí)行目標對應的源碼是 main.cpp。然后執(zhí)行cmake -S . -B build cmake --build build -j-S指定源碼目錄-B指定構建目錄。構建目錄和源碼目錄分開是 cmake 的默認最佳實踐所有的中間文件、緩存、生成物都在 build 目錄里不污染源碼樹。構建完成之后build目錄下會多出一個可執(zhí)行文件 demoLinux 下或 demo.exeWindows 下直接./build/demo就能跑。這段流程雖然簡單但它是后面所有高級用法的地基。后面我們聊到的變量、目標、依賴查找本質上都是在這套基礎上做擴展。3. 核心語法與目標target設計才是現(xiàn)代 cmake 的靈魂3.1 變量、緩存變量與環(huán)境變量cmake 里的變量引用方式很統(tǒng)一用${VAR}。你可以用set來定義變量set(PROJECT_VERSION_MAJOR 1) set(PROJECT_VERSION_MINOR 2) set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR})這里的變量是普通變量作用域從定義位置到當前 CMakeLists.txt 文件結束或者到子目錄/函數(shù)邊界被覆蓋。真正干活的時候普通人最常用到的其實是緩存變量它由配置階段記錄在 CMakeCache.txt 里。你可以在命令行用-D傳入也可以在 CMakeLists.txt 里用option來定義option(ENABLE_TESTS Build unit tests ON)如果用戶在執(zhí)行 cmake 時用了-DENABLE_TESTSOFF那這個 ON 就不會生效緩存變量優(yōu)先。環(huán)境變量用$ENV{VAR}讀取一般用于讀取系統(tǒng)環(huán)境信息比如$ENV{HOME}但實踐中不建議在構建邏輯里過度依賴環(huán)境變量因為不透明、不可復現(xiàn)。真正有版本依賴的配置都應該寫成 cmake 變量。3.2 以目標為核心的寫法PUBLIC/PRIVATE 怎么理解現(xiàn)代 cmake 的核心概念是“目標”。目標就是add_executable或add_library創(chuàng)建出來的東西你可以把編譯選項、宏定義、頭文件路徑、鏈接庫統(tǒng)統(tǒng)掛在它身上。最關鍵的語法是三個target_include_directories(mylib PUBLIC include) target_compile_definitions(mylib PRIVATE DEBUG_MODE1) target_link_libraries(mylib PUBLIC fmt)這里面的PUBLIC、PRIVATE、INTERFACE是最容易繞暈的地方。我提供一個我常用的理解方式先想象這個庫自己編譯時需要什么再想象使用者還需要什么。如果某樣東西既被庫自己用、又被子項目用那它一定是 PUBLIC。如果庫自己編譯時需要、但使用庫的人根本不需要知道那就是 PRIVATE。如果庫編譯時根本不需要純屬給別人用的那就是 INTERFACE。實際操作中經(jīng)常有人把所有東西一律寫成 PUBLIC這在單目錄小項目里也許沒什么問題但一旦項目復雜起來就會發(fā)生“沒必要地強依賴傳播”——比如內部用了某個私有實現(xiàn)庫結果把所有依賴這個庫的消費者都帶上了。正確的做法是默認從 PRIVATE 開始當出現(xiàn)“下游也需要”的明確需求時才升級為 PUBLIC。3.3 生成器表達式解決配置差異生成器表達式是 cmake 里最強大也最容易忽略的語法。它的形態(tài)是$...在配置階段會被求值在不同構建類型、不同平臺上產生不同內容。最常見的用法是區(qū)分 Debug 和 Release 編譯宏target_compile_definitions(app PRIVATE $$CONFIG:Debug:ENABLE_DEBUG_LOG $$CONFIG:Release:NDEBUG )這行代碼的意思是如果當前配置是 Debug 則定義ENABLE_DEBUG_LOG如果是 Release 則定義NDEBUG。在單一配置生成器如 Makefile下這個宏由CMAKE_BUILD_TYPE決定在多配置生成器如 VS下同一個構建目錄可以隨時切換 Debug/Release生成器表達式依然正確生效。單獨一個$CONFIG可能看不出多大威力一旦你要區(qū)分平臺$PLATFORM_ID、編譯器$CXX_COMPILER_ID、甚至可以判斷某條依賴是否存在再決定加不加某個鏈接庫生成器表達式幾乎成了唯一的優(yōu)雅解法。我用一個實際場景來體會它的價值。之前做一個跨平臺庫要同時支持 MSVC 和 GCC有些 warning 只有 MSVC 才會報有些只有 GCC 才會報。如果不用生成器表達式就得針對編譯器寫兩套 if 分支。用了生成器表達式之后一行搞定target_compile_options(mylib PRIVATE $$CXX_COMPILER_ID:MSVC:/W4 $$CXX_COMPILER_ID:GNU:-Wall -Wextra )這種寫法在 CMakeLists.txt 里顯得極簡而且可擴展性極強。4. 一個典型工程從單文件到多目錄完整落地4.1 目錄設計與 CMakeLists 分層隨著項目越來越大單文件 CMakeLists.txt 會變成一團亂麻。普遍的做法是分層寫根目錄一個總控 CMakeLists.txt子目錄各管各的。一個我常推薦給團隊的目錄結構長這樣project/ ├── CMakeLists.txt ├── src/ │ ├── CMakeLists.txt │ └── main.cpp ├── libs/ │ ├── CMakeLists.txt │ └── core/ │ ├── CMakeLists.txt │ ├── core.cpp │ └── core.h └── tests/ ├── CMakeLists.txt └── test_core.cpp根 CMakeLists.txt 只做幾件事聲明最低版本、項目名、設置全局編譯選項、然后用add_subdirectory引入子目錄。cmake_minimum_required(VERSION 3.16) project(MyProject LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) add_subdirectory(libs) add_subdirectory(src) add_subdirectory(tests)子目錄的 CMakeLists.txt 各自維護自己的目標。libs/core/CMakeLists.txt大概長這樣add_library(core STATIC core.cpp) target_include_directories(core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})而src/CMakeLists.txt則負責鏈接這個庫add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE core)這套做法的最大好處是職責清晰。根目錄不關心具體細節(jié)子目錄不關心全局配置。新人看到某個目錄打開這個目錄的 CMakeLists.txt 就能理解它編譯什么、鏈接什么。另外add_subdirectory天然地把不同目錄的目標放進同一個構建樹里目標名就是你在構建系統(tǒng)里可以直接引用的名字不需要手動去拼路徑。4.2 處理好第三方依賴find_package 的兩種模式真實項目幾乎不可能完全不依賴第三方庫。這時就要用到find_package。它的使用形態(tài)很統(tǒng)一find_package(OpenCV REQUIRED) target_link_libraries(myapp PRIVATE ${OpenCV_LIBS})find_package背后有兩種查找路徑理解它們能節(jié)省大量排查時間。第一種叫 Module 模式。它是利用 cmake 內置的FindXXX.cmake模塊在某幾個預定義路徑里去找?guī)?。大多?shù)系統(tǒng)庫都走這種模式比如find_package(Threads)、find_package(CURL)。這種模式里cmake 會設置一些約定變量比如常見的XXX_FOUND、XXX_INCLUDE_DIRS、XXX_LIBRARIES。第二種叫 Config 模式。庫在安裝時會攜帶一個XXXConfig.cmake或xxx-config.cmake配置文件里面對這個庫的目標、版本、依賴關系做了聲明。cmake 通過搜索CMAKE_PREFIX_PATH、系統(tǒng)默認安裝路徑等地方來找到這個配置文件?,F(xiàn)代庫越來越傾向于走 Config 模式因為信息完整而且可以直接暴露給target_link_libraries使用。如果庫始終找不到第一步不是改路徑而是確認你裝的庫版本里真的有沒有對應的 CMake 配置文件。有時候你從 apt 安裝了一個庫但只裝了運行時和頭文件沒裝-dev包配置文件自然就沒有。裝 Linux 下的庫務必把名稱帶dev的那個包一起裝上。find_package的REQUIRED關鍵字強烈建議寫上。少了它找不到庫時 cmake 只會靜默地跳過后續(xù)用到這個庫的代碼會在編譯階段報出一堆看不懂的錯誤排查難度成倍增加。寫上REQUIREDcmake 會在配置階段直接報錯并告訴你到底是哪個包沒找到省心得多。4.3 安裝與導出讓庫可以被別人 find_package如果你開發(fā)的是庫光能編譯出自己的目標還不夠還得讓別人在項目里通過 find_package 用上。這套玩法叫安裝規(guī)則與導出目標。核心就兩條命令。第一條是install(TARGETS ...)把庫和頭文件安裝到指定目錄。第二條是install(EXPORT ...)把構建時的目標信息導出到一個配置文件里。下面這個例子很典型add_library(mycore STATIC core.cpp) target_include_directories(mycore PUBLIC $BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} $INSTALL_INTERFACE:include ) install(TARGETS mycore EXPORT MyCoreTargets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) install(DIRECTORY include/ DESTINATION include) install(EXPORT MyCoreTargets FILE MyCoreConfig.cmake DESTINATION lib/cmake/MyCore )這里的$BUILD_INTERFACE:和$INSTALL_INTERFACE:又要用到生成器表達式了編譯階段把頭文件路徑指向源碼目錄安裝后則指向安裝目錄下的 include 路徑。這種設計我在實際維護公共庫時用得很頻繁一條規(guī)則通吃“開發(fā)時引用”和“安裝后引用”兩種場景根本不需要操心頭文件路徑對不上。5. 構建配置、編譯器差異與并行構建優(yōu)化5.1 構建類型單配置與多配置生成器cmake 的構建類型是另一個高頻困惑點。有人問為什么我在 VS 里能直接切 Debug/Release但命令行卻要傳-DCMAKE_BUILD_TYPERelease這其實取決于你用的是哪種生成器。Makefile 和 Ninja 屬于“單配置生成器”一次配置只能選定一個構建類型所以必須通過CMAKE_BUILD_TYPE在配置階段指定。VS 和 Xcode 屬于“多配置生成器”一個構建目錄內可以同時存在 Debug、Release、RelWithDebInfo 等配置構建時再用--config選項指定用哪個。如果你當初用默認方式在 Windows 上跑了cmake -S . -B build大概率生成的是 VS 工程。這時指令就要寫成cmake --build build --config Release我看到過不少人在 Windows 命令行下執(zhí)行cmake --build build死活出不來 Release 程序最后才發(fā)現(xiàn)默認生成的是 Debug。所以閱讀構建日志時一定要先確認自己用的生成器類型然后對癥下藥。構建類型的差異還會影響優(yōu)化級別。Release 默認-O3Debug 默認不帶優(yōu)化、帶調試符號除此之外某些宏定義比如NDEBUG也是隨構建類型切換的。我自己做性能排查時經(jīng)常要在同一個功能下各自編一版 Debug 和 Release 對比行為對這種差異尤其敏感。5.2 在 Windows 下用 cmake 配合 VS棧大小怎么設置這個熱詞問的人特別多。VS 里直接改棧大小可以通過鏈接器屬性面板但如果你用 cmake 管理項目就得通過鏈接選項傳給 MSVC。否則每次從 cmake 重新生成工程手動改的屬性都會丟失。MSVC 的鏈接器參數(shù)里/STACK:reserveSize,commitSize就是用來控制??臻g的。例如希望主線程棧開到 8MB可以這樣寫if(MSVC) target_link_options(mytarget PRIVATE /STACK:8388608) endif()注意單位是字節(jié)8388608就是 8 * 1024 * 1024也就是 8MB。實際開發(fā)中我遇到過遞歸深度較大的算法把默認 1MB 棧打滿的情況程序在隨機位置崩潰很難復現(xiàn)。用這個選項一下子解決了問題。如果不針對單目標直接在全局設也行set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} /STACK:8388608)但這種方式會影響所有可執(zhí)行文件不夠精細。我更推薦用target_link_options這樣語義清晰后面維護一看就知道是哪個目標需要大棧。另外需要提醒的是這個選項只對 Windows/MSVC 有效Linux 下線程棧大小通常是在代碼里通過pthread_attr_setstacksize控制的或者用ulimit -s調整進程級棧限制兩者機制不一樣不要把 Windows 這一套直接搬過去。5.3 并行構建與增量編譯cmake 構建的性能優(yōu)化很多時候反而是底層構建系統(tǒng)決定的。Ninja 在并發(fā)行和增量編譯上的表現(xiàn)比傳統(tǒng) Makefile 好不少。我自己現(xiàn)在幾乎全部項目都用 Ninja 生成器構建速度快、輸出干凈。指定 Ninja 的方法很簡單cmake -S . -B build -G Ninja cmake --build buildNinja 默認會充分利用 CPU 并行度所以不需要額外傳-j。如果用 Makefile 生成器并行需要顯式指定cmake --build build -j 8這里的-j是并發(fā)任務的個數(shù)通常設為核心數(shù)或略微高一點比較合適。太低了浪費時間太高了容易吃滿內存把機器拖垮。我的經(jīng)驗是 8 核機器用-j 8就挺好16 核機器用-j 16沒必要再往上加。增量編譯同樣是提升效率的關鍵。cmake 的構建系統(tǒng)會自動跟蹤每個目標的依賴文件改哪個文件就只重編哪個文件。但這里有個容易被忽略的問題如果你改了 CMakeLists.txtcmake 需要重新配置才能正確跟蹤新的依賴關系否則可能漏編譯。改完 CMakeLists.txt 后不要只跑cmake --build一定要先重新配置一次。6. 常見問題與排查技巧實錄6.1 經(jīng)典錯誤The following variables are used in this project這個報錯的全稱通常是CMake Error: The following variables are used in this project, but they are set to NOTFOUND。它看起來像天書實際含義很簡單CMakeLists.txt 里引用了某個變量但這個變量在配置階段變成了XXX_NOTFOUND。多半是find_package或者find_library沒有找到對應的庫。最常見的觸發(fā)場景是第三方依賴缺失。比如你寫了find_package(CURL REQUIRED)但系統(tǒng)里壓根沒有裝 libcurlcmake 會在配置階段把CURL_LIBRARY設置成CURL_LIBRARY-NOTFOUND最終報出這個錯誤。排查思路按照這個順序走錯誤特征可能原因排查操作XXX_LIBRARY-NOTFOUND庫未安裝或路徑錯誤先確認find_package(XXX)是否成功再檢查庫文件是否存在XXX_INCLUDE_DIR-NOTFOUND頭文件目錄未找到檢查頭文件是否安裝CMAKE_PREFIX_PATH是否指向正確前綴報錯出現(xiàn)在某個自定義變量CMakeLists.txt 邏輯錯誤檢查set或message的變量名拼寫是否一致還有個小技巧在 CMakeLists.txt 里臨時加一行message(STATUS XXX_LIBRARY${XXX_LIBRARY})重新配置就能直接在控制臺看到變量到底被解析成了什么。這個辦法在排查任何“我覺得我明明設置了但它還是 NOTFOUND”的場景時都非常有效。6.2 緩存殘留與“我改了都沒生效”這個問題幾乎每個用 cmake 的人都會撞上幾次?,F(xiàn)象是改了某個-D參數(shù)或者改了系統(tǒng)某個環(huán)境變量甚至已經(jīng)重新執(zhí)行了 configure但 cmake 依然使用舊的值。造成這種情況的根源是 CMakeCache.txt。cmake 在第一次配置時會把所有緩存變量記錄下來。后續(xù)重新配置時如果你沒有在命令行里明確指定某個變量cmake 會沿用緩存里已有的值而不是重新去探測。這在設計上是故意的目的是加快配置速度但也造成了很多誤判。處理辦法就一句話當你懷疑“改了沒生效”時直接把 build 目錄刪掉重建。rm -rf build cmake -S . -B build這個操作我每周都會做上幾次尤其是從別人那里接手一個構建目錄時。刪除緩存雖然會讓配置時間變長不少但能保證一切從干凈狀態(tài)開始排查思路會清晰很多。如果你舍不得刪整個構建目錄也可以只刪 CMakeCache.txt。但需要注意有些生成文件是在配置階段根據(jù)舊緩存生成的單獨刪緩存偶爾會造成不一致所以還是整個目錄重建最穩(wěn)妥。6.3 交叉編譯場景下的 toolchain 文件不只是嵌入式項目現(xiàn)在不少人也會在 Windows 上開發(fā) Linux 的產物或者在 x86 的機器上編譯 ARM 的代碼。cmake 對這類場景的標準解法是編寫一個 toolchain 文件然后通過-DCMAKE_TOOLCHAIN_FILE指定。一個典型的交叉編譯 toolchain 文件大概長這樣set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g) set(CMAKE_FIND_ROOT_PATH /path/to/arm/sysroot) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)這份文件的核心作用是告訴 cmake 三件事目標平臺是什么、用什么編譯器、去哪里找目標環(huán)境的頭文件和庫。CMAKE_FIND_ROOT_PATH在這里尤其重要它讓find_package去交叉編譯的 sysroot 目錄里找依賴而不是去宿主機的系統(tǒng)目錄里找。否則很容易出現(xiàn)棋差一著的錯誤比如在 x86 機器上找到了 x86 版本的 OpenSSL鏈接出來的 arm 版本程序直接運行失敗這在嵌入式開發(fā)里是典型的配置陷阱。這類問題排查起來比較陰間最好的方法還是從第一步就正確使用 toolchain 文件并保證CMAKE_FIND_ROOT_PATH指對。6.4 常見構建錯誤速查表報錯信息可能原因解決思路No CMAKE_CXX_COMPILER found編譯器未安裝或未在 PATH 中確認 g/clang 可用重新配置CMake Error at ... add_library cannot create target目標名與已有庫沖突檢查項目內是否重復定義同名目標Cannot specify include directories for imported target對 IMPORTED 目標錯誤使用了 include 指令改用 target_link_libraries 或 INTERFACE 屬性The CXX compiler identification is unknown編譯器無法識別或配置被緩存污染刪除 build 目錄后重新配置ninja: error: unknown argument語法問題或者生成器與 cmake 版本不匹配檢查構建命令改用cmake --buildundefined reference to ...鏈接庫順序或庫未鏈接檢查 target_link_libraries確認目標傳播屬性正確最后再分享一個小技巧如果你要給 cmake 生成一個“干凈利落”的編譯數(shù)據(jù)庫用于編輯器或 IDE 的代碼索引可以在 CMakeLists.txt 里加一行set(CMAKE_EXPORT_COMPILE_COMMANDS ON)配置完成后構建目錄下會生成compile_commands.json這里記錄了每個源文件用什么樣的編譯選項。我給 clangd 指向這個文件VSCode 或 vim 里的補全、跳轉和編譯選項就和 cmake 完全一致了。平時寫代碼時再也不用擔心“IDE 里不報錯實際編譯卻報錯”這種尷尬局面。這也是我對 cmake 最深的體會它本質上不是一個與你日常寫代碼割裂的環(huán)節(jié)而是連接源碼和工具鏈的橋梁。多花點時間把構建邏輯理順后面幾年省下的時間絕對值得。平時養(yǎng)成“讀 CMakeLists.txt 時多問一句為什么這樣寫”的習慣踩坑的次數(shù)會少很多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
性综合网| 男女啪啪做爰高潮无遮挡| 亚洲黄3级片网站欧美| 99热这里只有精品99| 另类激情四射| 婷婷色色色| 网站免费一站二站| 久久99热 这里有精品| 97在线视频观看| 99re热免费观看视频精品| 碰97久久| 久久婷婷老| 最新va在线播放| 97干97色| 五月天婷婷操逼视频| 激情五月综合亚洲另类| 夜夜爽天天爽| 五月婷婷开心综合| 五月天成人伊人| 久久182| 91婷婷丁香五月| 丁香五月激情宗合| av国产精品偷| 色你久久| 日美三级| 天天色凹凸| 丁香五月最新地址| 精品国产AV色一区二区深夜久久 | 九九热a| 狠狠婷婷色| 婷婷色色丁香五月天| 色色无码日韩| 最新色色五月天| 五月天婷婷色综合| 国av网| 精品人妻久久久久久| 噜噜噜久久亚洲精品国产品91| 18av天堂| 激情5月舔| 九九re视频在线视频| 啪啪一区| 极品少妇XXXX精品少妇偷拍| 天天操夜夜操| 日本熟妇乱妇熟色A片蜜桃| 人妻九九九九| 五月亭亭直播| 专区无日本视频高清8| 日韩久久视频| 国产成人网址| 精品久久人妻| 五月丁香综合| 国产XXXX搡XXXXX搡麻豆| 亚洲第一第二网站| 五月婷婷综合网| 99在线69| 91久久久久久| 日本欧美成人片AAAA| 九九热最新| 日本激情91| 久久久久丁香婷婷五月天| 深爱激情中文五月天av| 久热婷婷| 人人操Av| 九九热这里只有精品一| 开心网五月色婷婷| 9久国产| YW无码| 六月成人网| 秋霞免费视频| 亚洲日本三级片| 综合色七七| 成人午夜天| 国产成人精品一区二区三区视频| 丁香五月婷婷色综合| 欧洲第一无人区观看| 欧亚成人A片一区二区| 日韩操人| 青青久久91| 婷婷六久久| 婷婷丁香六月天激情四射网| 日本在线视频播放91| 97在线/亚洲| 91丨九色丨熟女丰满| 成人在线日韩欧美| 久婷婷五月激情| 亚洲在线激情婷婷五月| 日日爱激情| 婷婷久久丁香| 99成人| 最近中文字幕2019视频1| 无码激情AAAAA片-区区| www.综合久久| 538在线| 天天干天天操天天上| 成人无码精品1区2区3区免费看| 精品一二三区久久AAA片| 亚洲婷婷性爱| 亚洲综合在线视频| 五月婷婷六月基地| 亚洲色网址| 丁香伍月婷电影全集| 日日噜噜久久婷婷五月天| 综合激情五月婷婷| 五月婷婷开心六月激情小说| 99久.| 天天操天天插| 五月丁香色| 色综合播放| 伊人五月成人| 东京热免费视频| 人人操婷婷| 人人操婷婷| 综合伊人久久| 久99热| 色色五月丁香婷婷| 日韩无码乱轮| 五月婷婷激情综合视频| 久久精品人妻| 丁香花五月天激情| 天天噜| 综合久久婷婷| 中文字幕永久免费| 丁香婷婷色五月激情综合| www色五月| 八戒青柠影视剧在线观看| 91碰碰视频在线观看| 天天做天天爱天天爽夜夜揉| 狠狠色大香蕉| 五月婷视屏在线观看| 久久98| 极品五月天| 影音先锋xfplay资源男人网| 91九色视频| 欲色人妻| 色欲天天综合| 激情五月天天| 五月婷婷丁香五月婷婷| 另类少妇人与禽zOZZ0性伦| 98永久精品| 另类激情五月| 婷婷丁香91综合| 色婷婷五月影视| WWW.桔色成人.COM| 2017人人操| 激情五月四色| 婷婷伊人綜合| 五月精品| 九九99九九99九九99视频网| 淫视馆AV在线| 大香蕉啪啪| 欧美丁香婷婷五月天| 亚洲成av人影院| 日本综合色图| 97人人射| 激情亚洲色图片丁香综合| 久久三级视频| 另类色视频| 欧美三级欧美一级| 9久久精品| 五月婷婷偷拍| 99 r热| 91超碰在线播放| 婷婷玖玖丁香| 亚洲操操| 天天做天天双| 久久大大香| 中文不卡一二三区| 日韩久久日| 99综合激情久久精品久久| 天天草天天爱| 色综啪啪| 97碰| 开心四月婷婷在线色播播| 中文av网站| 五月丁香婷婷网网网网| 婷婷丁香九色| 久久九九国产精品怡红院| 伊人热婷婷| 99免费| 第四色网婷婷| 99热在线观看免费精品| 国产精品色一哟哟| 久久亚洲无码| 色色99| 日韩成人五月天| 男妓跪趴把舌头伸进我的嘴巴| 亚洲欧洲色色| 丁香五月婷婷综合91| 开心五月网 | 色五月婷婷大| 激情五月天婷婷丁香| 亚洲色在线观看| 欧美大道不卡| 大香蕉五月天婷婷| 亚洲色色香蕉| 5月激情天| 香蕉久久国产AV一区二区| 婷婷丁香五月六月激情| 色久影院| 青青草青青草五月天| www、色色色| 婷婷五月综激情| 久久综合五月天| 色色无码| 五月天激情小说网| www 五月天 com| 1024在线视频| 年轻的妺妺伦理HD中文| 久久婷婷五月综合激情国产| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 五月激情综合网| 日韩好吊操| 丝雨一区二区| 九九av| 五月草视频| av九九| 北条麻妃伊人 | 综合五月婷婷| av第一二区| 天天日天天干天天操| 四色女婷婷| 国产精品色婷婷久久久精品| 9久9久9久女女女九九九一九| 91seav| 欧美性爱5月天天天看| 综合网啪| 婷婷色基地在线看 | 五月丁香婷婷五月色| 影音先锋777xfplay色资源网站| 激情99热| www.99日本| 婷婷自拍| 五月开心深深爱激情综合| 亚洲综合视频网| 婷婷综合中文字幕| 可以免费观看的AV| 超碰精品在线| 91精品综合久久久久久五月丁香| 日亚二欧美| 色狠狠色噜噜噜a天堂一区| 久操综合| 亚洲综合在线播放| 天天肏天天肏天天肏| 色色欧美色色色| 99色在线| 综合激情站| 播五月,色五月,开心五月播放器 | 玖玖色资源| 久热精品免费视频4| 天天天天操| 色狠狠综合网| 狼友视频在线观看18| 这里只精品热在线18| 久久久久久久久久久久久久人妻视频| 丁香五月六月久久综合| 婷婷久久五月| 天天爽夜夜爽夜夜爽精| 婷婷五六月丁香| 激情丁香婷婷| 丁香五月天在线观看视频| 五月丁香激情综合啪啪| 激情五月天综合网| 免费亚洲婷婷中文字幕| 久久久五月天| 欧美天天爽| 玖热精品综合视频| 五月天第四色开心色播| 五月天色导航| av性爱在线| 五月丁香另类网| 色婷婷五月网| 五月婷婷 激情五月| 开心五月婷婷在线| 亚洲亚洲永久无码777777| 99热这里只有精品69| 亚洲丁香五月天在线视频| 久去色色| 五月婷婷亞洲中文| 婷婷综合一二三| 性综合网| 天天天天天天操| 亚洲a色| 五月丁香啪啪啪| 天天日天天舔| 9九九久久精品无码专区| 五月丁香花成人社区| 五月天激情Av| 一起草性爱不卡视频| 五月婷婷说| 99热这里只有精品搜| 久久er99| 精品久久久人妻| 九九久久99| 国产真实乱了老女人视频| 色婷| ..真实国产乱子伦毛片| 婷婷五月天精品| 色哟哟性爱av| 狠狠操天天操综合| 丁香五月婷婷AV在线| 综合性爱网| 九九热在线99| 97涩婷婷婷婷基地| 久久婷婷五月天懂色| 丁香无五月网| 婷婷亚洲欧美丁香五月| 五月综合激情网| 不卡的AV网站| 色情五月综合婷婷| 综合激情网激情五月。| 五月天另类小说| 一本大道熟女人妻中文字幕在线| 97碰人人操| 天天舔天天插天天爱| 中文字幕性爱丰满| 99热在线观看免费精品| 伊人五月婷婷国产视频| 夜夜夜夜做天天天做无码视频| www.深爱激情| 久久久婷| 91viP在线看| 99在线看片| 五月天婷婷AV| WWW.五月com| 色婷婷欧美| 六月丁香综合999| 99在线视频免费| 国产精品久久欧美久久一区| 久操人妻| 久久人妻人人| 久久婷五月影院| 色九区| 日韩在线五月天婷婷| 久久国产色| 丁香五月婷婷影院| 五月婷婷色情| 中国丰满熟女A片免费观| 中文字幕婷婷在线| 五月激情精品视频| 伊人久久婷婷| 色婷婷狠| 久久婷婷丁香| 亚洲人妻电影| 色色色色五月| 色综合9| 丁香五月天激情五月天激情五月天激情网| 色停停香蕉视频| 色亭亭丁香五月天| 亚洲婷婷激情888精品久| 97精品综合久久| 99日视频在线| 99A片| 99re欧美精品| 深爱开心五月天| www激情| 思思99久久| 婷婷五月天黄色小说| 国产欧美精品AAAAAA片| 丁香婷婷五月天网站| 欧美va视频| 丁香五月黄色| 狼人狠狠操| 五月天婷婷色色首页| 五月婷婷在线观看| 黄色aa观看aaguochan| 欧美五月丁香在线观看| 影音先锋91网站在线观看| 夜夜骑日日操| 国产亚洲成AV人片在线观黄桃| 丁香六月综合激情| www.婷婷五月| 综合久色五月| 人人色人人弄人人操| 五月天婷婷色紫薇阁| 激情五月婷婷在线| 禁片二区| 噜噜在线| 狠狠操狠狠爱| 成人精品一区日本无码网| 秋霞三级色戒| 99热在线观看| 99视频精品全部观看10| 婷婷五月天久久综合88| 天天色图| 亚洲成色综合网站免费观看| 夜夜嗨一区二区三区直播内容 | 99热这里都是精品| 色色婷婷丁香| 第九色区av天堂| 婷婷丁香成人在线视频| 亚洲精品**不卡在线播he| 天天干天天射色综合| 99热九九九九| 色婷婷A| 超碰在线99热| 六月婷婷开心| 丁香五月激情综合网激情五月| 九月丁香婷婷| 久狠狠狠| 亚洲色婷婷婷婷人人爽| 九九九九成人| 久久婷婷热| 欧美群妇大交乱婬网| 粉嫩AV久久一区二区三区| 亚洲丁香五月| 五月婷色色| 五月丁香婷婷综合| 欧美色色网| 任你擦免费视频| 色99在线| 97碰碰视频| 婷婷色播色五月五色五月天色妇| 东北熟女视频99| 日本熟妇精品99| 人人添人人| 超级碰碰视频无码| 免费观看的av| 婷婷六月综合基地| 婷婷四色五月| 久热大香蕉| 六月五月天婷婷涩播在线| 激情网婷婷五月天| 欧美婷| 91综合网| 久久久激情| 久久婷婷成人视频| 成人一区在线观看| 国产精品涩涩涩视频网站| www.99视频| 26uuu视频欧美| chaopeng在线人人| 五月丁香成人网| 综合一本道| 成人电影一区| 色玖玖玖| av婷婷丁香| 精品人妻一区二区三区四区不卡在| 久久久人妻| 丁香婷婷六月| 99在这里有精品| 婷香五月网在线| 97伊人综合婷婷| 久久色情| 色五月天婷婷| 色九九综合| 99色免费观看全部| 欧美激情综合色综合色| 五月丁香婷婷激情| av婷婷丁香 六月| 视频一二区| 五月婷婷久久网| 久久五月婷| 婷婷中文在线| 综合网啪啪| 色色色色色色色色色色色色色色,网站| 六月丁香深深爱综合网| www综合久久| 国自产拍偷拍精品啪啪一区二区| 99在线观看精品视频| 日日肏天天操| 婷婷婷五月天最新综合你懂的| 二色av| 综合久久高清| 九九狠狠干| www.com.色色| 欧美日韩成人在线网站| 五月天激情网址| 二区成人视频| 青青草婷婷久久| 人人摸人人干| 色婷婷激情Av久久久| 久久小说网| 五月综合视频| 无码AV久久久久久久久| 一区二区成人电影免费播放| 99天堂在线观看免费视频| 偷偷与邻居做爰完整视频| 丁香五月影院| 婷婷不干网| 亚洲国产精品VA在线看黑人| 成人做爰A片免费看网站找不到了 噼里啪啦在线观看免费完整版视频 | 五月婷婷狠狠干| www.人人操人人看人人想人人摸 人人人人操,COM| www.婷婷| 99精品这里只有免费视频| 超碰免费成人| 综合激情五月婷婷| 亚洲一个色| 激情婷婷五月亚洲| 激情五月婷婷综合视频| 色色色.COM| 影音先锋777xfplay色资源网站| 欧美激情综合色综合| 99久久玖玖| 五月久视频| 色婷婷天堂| 中文字幕成人| 亚洲精品久久久久久久久久吃药| 色婷丁香91| 黄色成人AV在线| 99内射视频| 久久九九中文字幕| 超碰三级秋霞| 色丁香五月婷婷在线| 五月婷婷官网色| 东京热伊人| 五月天婷婷丁香| 91丁香综合| 97久久精品视频| 久久婷婷草| 99热爱爱干干日| 天天艹天天综合网| 丁香五月开心五月激情| 色呦呦美女| 99热在线看| 9精品久久999| a在线免费v| 秋霞三级色戒| 五月婷婷激情综合网 | 在线国产精品色| 亚洲九九九九| 9久久婷婷国产综合精品性色| 欧美色婷婷| 九七色色六月丁香| 久月婷婷| 激情婷婷色五月| 97超碰在线免费观看| 色五月天影视| 天天色视频| 亚洲综合色网| 91青娱乐青青草| 亚洲精品操一操、噜一噜、摸一摸、爽| 狠狠色婷婷六月激情网| 色五月在线播放| 十二区无码| 丁香五月婷婷激情网| 互月天综合| www.久久久久| 丁香久月| 都市激情五月婷婷综合| 一级二级色大片| 中文字幕成人| 99九九在线观看免费| 天天日狠狠| 婷婷月综合| 99在线看视频| 少妇婷婷五月天| 99热久草| 色色影院黄大片| 丁香五月98| 色色色色综合网| 欧美毛卡| 思思热精品在线观看| 可以看的av| 久久婷婷五月天懂色| 丁香六月欧美| 丁香社92视频| 天天色,天天日,天天做| 激情五月婷婷综合秋霞| 五月婷婷开心色伊人| 99热爱爱干干日| 亚洲精品九九| 色狠狠综合| 成人短视频在线| 激情性爱五月天网页| 亚洲激情无码久久| 六月 丁香 视频| 色婷婷狠狠久久YY| 五月香婷婷| 五月婷综合| 可以免费看的av网站| 国产欧美熟妇另类久久久 | 97人操人免费视频| 九九热99熟女| 婷婷久久99| 婷婷社区五月天| 色婷大香蕉| www.丁香五月| 色综啪啪| 韩国天天婷婷| 色婷婷另类| 五月丁香六月婷婷综合网| 天天做天天爱| 99高级会所久久| 婷婷大香蕉| 天天爱天天日| 中文字幕日本最新乱码视频| 色婷婷六月精品| 99国产精品久久久久久久久久久| 九玖欧洲亚洲| 天天透天天干| 五月婷婷人人人操| 午夜丁香丁香婷婷| 国产成人精品一区二区三区视频| 色婷婷香蕉丁丁网| 色婷婷女优有码五月亭| 另类激情五月| 精品婷婷五| 99爱在线视频| 丁香五月激情视频| 91九色小视频| 色色色热| 五月婷婷啪| 国产婷婷综合| 97精品欧美91久久久久久久| 97人人操人人爽| 欧美在线视频免费播放| 最新日本A片| 做爰丰满少妇1313| 婷婷五月无码| 九九九九国产| 日韩AV免费看| 色婷久| 五月色婷婷在线观看| 色婷婷基地 | 99久久大片| 婷婷伊人75| 这里只有精品视频| 婷婷五月天黄色小说| 婷婷五月电影| 夜夜嗨一区二区三区直播内容| 自拍盗摄 另类| 天天色丁香| 蜜桃五月天| 这里只有精品99www| 4399无码视频| 亚洲成人AV在线观看| 激情婷婷综合| 123草逼网| 福利视频在线播放| 99久久久久久www| 亚洲丁香五月天在线视频| www.com在线操视频免费观看| 91日本在线观看| 天天操九九插| 99视频自拍| 五月天色色色网| 九九热最新地址| 青青草原99热| 五月天激日本色情在线| 哇嘎成人久久| 青青草大香| 人妻熟妇国产精品| 精品51XX| www.99热国产| 性欧美日本| 狠狠狠狠狠狠草| 噜噜在线| 欧美色99| 亚洲国产精品VA在线看黑人| 激情五月少妇| 禁欲电影完整版在线播放| 激情五月丁香婷婷| 天天成人丁香美女AV| 久久99网站| 五月丁香六月婷婷综合| 高清无码入口| 免费国产视频| 99热综合网| 五月天激情网页| 五月天婷综合网站| 激情五月婷婷| 91色色色18| 亚洲中文AV网站| 成人无码精品1区2区3区免费看| 91欧美日韩综合| 九九热最新地址| 色性日本| 丁香五月激情视频在线| 大波美女VA网站| 亚洲综合在线视频| 久久性视频| 狠狠色丁香久久| 欧洲电影在线观看免费版英语版| 99热色精品| 亚洲综合成人网| 99精品无码| 艹| 色婷婷色久综| 天天干,噜噜色,狠狠色| 丁香五月日啪| 九九精品网站| 如何安全看伊人婷婷| 好看的国产精品| 天天肏天天肏天天肏| 亚洲成Av人片乱码色第1集| 激情九月丁香婷婷| 丁香婷婷五月综合欧美另类| 色五月天 丁香| 9|人妻人人操| 亚洲电影中文字幕| 五月婷婷黄色毛片| 五月婷婷丁香啪啪| 久综合色| 丁香五月天欧美成人| 五月天婷亚洲天综合网综合| 777.色色| 五月婷婷手机在线| 91免费在线视频6| 婷婷无码视频| 操操操av| 丁香五月23111| 五月色天情| 五月天激情图片| 久久99久久99精品免观看粉嫩| 久久婷婷久久| 99亚洲精品视频| 777精品久无码人妻蜜桃| 日韩在线观看网址| 热婷婷在线视频| 国产精品操| 99婷婷五月天| 五月六月激情| 99久在线观看| 国产亚洲精品久久久久久郑州| 日本综合九九| 午夜激情四射影院| 五月伊人网| 噜噜噜噜噜日本视频| 五月香六月婷| 91AV婷婷| 国产精品美女久久久久AV超清| 激情五月黄色| 久热91精品| 98毛片| 亚洲日日操| 99ri在线视频| www.婷婷com| 色婷婷免费视频| 亚洲精品乱码久久久久久综合| 99热只有这里才是精品| 九九九色综合| 成人AV播放| 9999三级片| 天天cha成人综合网| 色99在线| 国产五月视频| 久操大| 成人欧美Va| 人妻aV在线| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 91色综合网| 内射人妻视频国内| www.精品99| 色99综合视频| 开心五月网| 97AV人人插人人操| 激情校园 亚洲| 视频色色色色色色| 第九色区av天堂| 日本婷婷在线| 91小黄书网址在线观看| 99热精品中文字幕| 五月深情久久| 亚洲色情激情丁香五月| 日本高清久久| 懂色av蜜臀av粉嫩av永陈冠希| 这里只有精品,日韩视频| 少妇性按摩无码中文A片| 亚洲深喉AV| 另类激情五月天。| 婷婷五月天黄色小说| 欧美黑人巨大性生话| 色婷五月| 激情五月天啪啪| 狠狠色丁香久久综合婷婷亚洲成人福利| 久久亚洲婷婷综合色五月| 婷婷五月天成人| 97色五月丁香婷婷| 精品九九视频| 婷婷五月天网| 丁香色五月直播| 婷婷五月电影| 婷婷九色| 五月婷婷69| 欧美日韩成人h| 玖玖资源网站最新站| 另类图片激情五月| 男人天堂 久久| 亚洲五月情| 免费视频在线观看的网站| 五月婷婷六月丁香激情深爱| 91精品无码| WWW.久久久久久久| 99九九热在线观看| 99久久99久久| 免费啪啪亚州视频| 成人综合视频在线| www.婷婷,com| 五月丁香激情怕怕| 久久ab| 亚洲啪啪精品| 丁香五月在线观看| WWW·色色色·COM| 色噜噜五月天| 超碰人人艹| 国产精品久久..4399| 香蕉操亚洲| 亚洲99综合| 综合色色网| 啪啪91| 99色在线观看免费| 99网| 天天色,天天操,天天射| 九九热在线观看视频| 日韩欧美成人片| 99九九视频精彩在线| 久久综合丁香| 激情网五月| 婷婷久久国产视频| 黄色录像网点| 婷婷五月天开心激情网| 光棍影院日韩精品| 婷婷中文无码| 婷婷五月天色丁香| 99精品视频免费观看近期发布| 永久99免费视频网站| 亚洲视频综合网| 色婷婷狠狠干芒果TV| 激情婷婷视频在线| 日本一道久久| 精品婷婷五月天| 丁香狠狠色婷婷久久无码视频| 精品人妻久久久久久| 五月丁香成人| 五月丁香六月激情综合| 思思热久久婷婷五月天| 成人啪啪色婷婷久| 五月丁香激情综合网| 婷婷月五天在线在线看| 激情五月婷婷老师| 免费AV在线| 玖月婷婷爱丁香| 伊人九九68| 97婷婷丁香| 怕怕av| 五月婷婷之综合激情在线| 日本啪啪网| 人人天堂操| 伊人玖玖婷婷| 色综合色综合网| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | 伊人啪啪网| 激情综合久久| 桃色五月婷婷| 97碰超级人人看| 天天摸日日舔狠狠添婷婷婷| 日本色啪| 激情五月小说婷婷| 五月婷婷片| 99精品无码视频| 日本天堂网站99| 丁香色色网| 丁香九月婷婷色| 五月激情啪啪啪| 国产乱人偷精品人妻A片| 天天舔天天摸| 操碰97| 月色色综合婷婷网| 国产亚洲99久久精品| 日日夜夜狠狠| 亭亭五月激情亚洲在线| 五月激情综合网| 99碰碰碰| 国产欧美精品AAAAAA片| 97香蕉久久超级碰碰高清版| 婷婷亚洲色| 天天舔天天摸天天射| 激情爱爱网站超大免费| 免费看欧美成人A片无码| 婷婷视频在线| 日本婷婷丁香五月| 久久久网站| 色综合久久综合| 亚洲深喉aV| 操骚货在线| 色婷婷888| 婷婷亚洲欧美丁香五月| 五月婷婷网久久| 快乐婷婷五月天| 伊人狠狠丁香婷婷综合尤物| 久久全色| 青青草原亚洲久| 免费无码毛片一区二区A片| 日本色色网| 九九精品亚洲| 丁香婷婷五月| 色婷婷丁香五月天| 99热九九在线| 天天肏天天插| 欧美色骚婷婷五月天| www.精品久9| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 天天拍夜夜爽| 99热99热在线观看| 丁香六月激| www.色99| 日本在线视频www色| 九九热在线99| 99久久精品国产色欲| 9久热在线视频| 丁香五月激情啪啪综合| 婷婷五月情| 九九av| 99性视频| 香蕉综合网| 综合色播| 99热8| 狠狠色综合网| 天堂成人A片永久免费网站| www色色色com| 99热精品在线| 欧美成人猛片AAAAAAA| 婷婷色婷婷| 精品少妇人妻AV无码专区偷人| 欧美性生交XXXXX无码小说| 丁香婷婷色五月| 亚洲熟妇AV乱码在线观看| 久久AV无码精品人妻系列试探| 国产欧美性成人精品午夜| 久久AAAA片一区二区| 9精品久久999| 大香蕉视频婷| 99久操| 色婷网| 十月丁香婷婷| 色五月天成人在线| WWW.色婷婷.COM| RenRenSe在线视频网站| 五月开心婷婷| 人。妻久久| 久久婷婷久久| 天天射影院| 四川女人毛多水多A片| 天天肏在线视频| 色色色色色五月| 人操91在线| 色色色地址| 综合激情伊人影视在线| 伊人综合网4| 伊人AV五月婷| 免费看成人747474九号视频在线观看| 97久久超碰| 超碰97在线操| 99碰视频| 婷婷丁香花五月天| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 色色色99| 亚洲亚洲人成综合网络| 五月天婷婷丁香人人操91| 亚洲综合一区二区| 激情久久四色| 婷婷五月天六点丁香五月| 99男人的天堂| 人人爱操| 九九伦子片| 五月丁香六月婷| 精品九九视频| 区美毛片子| 欧美69久成人做爰视频| 九九精品热播| 色综合xx| 久久婷网| 免费观看欧美成人AA片爱我多深| 91精品啪| 激情精品久久| 99热亚洲| 少妇AB又爽又紧无码网站| 五月天婷婷激情网| 日韩无码一区二区三区四区| 激情欧美丁香五月| AA丁香综合激情| 97婷婷丁香五月天激情图片| 五月婷婷综合热| 狠狠色成人影片| 性一交一乱一交A片久| 九月婷婷在线视频| 99热只有精品综合| www.操.com| 欧美性生交XXXXX无码小说| 成人综合AV| 岛国av电影网站| 天堂中文国产| 五月婷婷综合成人| 91操色| 另类精品视频在线观看| 丰滿爆乳一区二区三区| 色婷婷综合久色AV五色最新| 五月婷婷六月激情| 婷婷五月花| 超碰人人超碰| www五月天com| 黄色片久久| 婷婷激情伍月网| 99色在线视频| 色色操| 五月丁香福利| 五月婷婷色播| 婷婷日韩| wwwC0maV五月花| 激情深爱五月天| 久久婷五月婷| 亚洲综合色棒| AA片在线观看视频在线播放 | 第四色五月婷婷| 亚洲AV日韩在线观看| 亚洲婷婷丁香五月在线| 9色在线| 9 99免费视频| 无套内射极品大美女| 婷婷视频网| 久久久久激情| 超碰在线免费9| 久久中国毛毛片爱久久| 开心五月天激情网站| 久久人人做人人妻人人玩精品va| 综合五月草| 天天干天天干天天操| 色域五月婷婷丁香| 天天爱天天狠天天透| 久久婷婷色综合老司机| 日日爱699| 亚洲黄色操逼| 天天操夜夜肏| 99热在线极品极品| 色久激情在线| 99久操视频| 新激情五月天色播| 五月丁香色停停啪啪啪| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 99热黄| 日韩1区2区| 亚洲视频1区| 亚洲激情婷婷| 久久一级片| 性热视频99精品| 婷婷综合亚洲| 丁香色婷婷| 婷婷丁香六月综合激情站| 97干在线视频| 91九色国产| 色色色99| 激情综合网,婷婷五月天| 日韩性爱AV| 十月丁香九月婷婷综合| 99男人的天堂| 色9999日韩国产| 婷婷爱五月天人人爱| 婷婷天堂视频| 九九热视频在线观看| 国产片色| 狠狠色色综合| 五月开心网| 激情五月小说婷婷| www.yw尤物| 色啦啦视频| 99这里有精品视频| 人人色AV| 亚洲视频操| 成人综合网站| 激情五月婷| Av狠狠色丁香婷| 亚洲狠狠丁香婷婷香蕉| 99综合网| 99热99成人| 色婷婷8| 丁香久久五月婷综合| 五月狠狠| 无码色| 色色综合网络| 久久婷婷综| 久久久一级AAA| 五月天婷婷丁香社区| 91精品婷婷国产综合| 大香蕉伊人久久| 美英法精品无码免费视频| 9久久网| 久久久久人妻| 婷婷综合色播网| 天天久久狠狠色综合| 97精品人人A片免费看| 美英法精品无码免费视频| 在线观看欧美| 99人妻碰碰久久久禁片| 九九青草热| 开心亚洲久久开心| 国产精品久久久久久喷浆| 日日夜夜狠狠| 五月婷伊人| 婷婷成人AV| se99视频| 开心激情网五月| 另类色视频| 国产精品人妻在线网址| 天天综合网站| 六月丁香中文字幕| 99色看| 婷婷色导航| 久久伊人婷| 婷婷激情四射| 婷丁香五月天| 色狠狠综合| 色婷婷久久综合久色| 色吊丝永久访问网址| 国产成人网站在线观看| 丁香五月天资源网| 99热99这里有免费的精品| 色99在线| www...com黄在线观看| 九九成人视频| 日本在线99| 操操操AV| 色五月婷婷、老熟女| 高清国产AV| 五月丁香六月停停停| 91狠狠色丁香婷婷综合久久精品| 婷婷丁香宗合888| 99在线精品在线视频| 五月丁香综合伦理片| 黄色91在线观看| av操B网站| 国产成人精品一区二三区熟女在线| 在线天堂9| 米奇影视资源婷婷狠狠色激情欧美五月丁香 | 高清无码.com| 色色五月天婷婷| 五月丁香六月婷婷成人| 日本久久色| 日韩成人无码| 深爱五月婷婷| 色欲色香综合网| 七七色色综合| 91午夜激情| 欧美日韩AAA| 激情五月com| 五月婷无码| 欧美丁香婷婷天天操| 色婷婷综合久久久久| 亚洲色夜| 亚洲综合一区二区| 99re热在线视频观看| 停停综合色色| 疯狂做受XXXX高潮A片动画| 精品人妻伦一二三区久| 综合激情婷婷| 五月激情综合网| 欧洲不卡视频| 婷婷久热| 日本色色色| www.五月天婷婷| 久久性视频| WWW.桔色成人.COM| 亚洲乱码日产精品BD| 国产成人AV| 综合九色| 丁香五月综合激情性爱| 人人操99| 五月熟妇婷婷久久| 亚洲第一视频 久久| 五月天播播中文字幕| 操99| 爱超碰性| 无码A片一区二区免费| 五月婷婷AV| 天天草婷婷五月| 天天摸夜夜夜| 婷婷丁香九月| 色婷五月| 久久婷婷五月综合网| 狼人婷婷综合| 狠狠88综合久久久久噜噜噜| 五月丁香无码| 99在线观看精品| 99热综合| 色婷婷亚洲综合av| 色综合九九| 开心五月综合激情综合五月| 婷婷五月草| 思思热精品在线视频| 91夫妻视频| 色婷婷a v| 六月色色综合| 可以直接看的av| 高清无码入口| 国产无遮挡又黄又爽免费网站| 精品国产va久| 五月天成人在线| 91操在线视频| 免费视频WWW在线观看网站| 国产第99页| 欧美五月丁香在线| 婷婷草| 狠狠草在线观看| Caoub青青超碰| 9九热视频| 天天操人人干| 色综合久久888| 小泽玛利亚视频一区二区| 九热在线这里有精品6| 久久人妻人人| 亚洲日韩乱码一区二区三区四区 | 婷婷五月婷婷| 永久热91| 天天操夜夜夜拍拍拍| 情色婷婷五月天| 欧美在线ee日韩| 色VA| 婷婷丁香色情| 碰碰碰碰碰99| site:wpjngj.com| 伊人玖玖精品| yw国产AV| 久色姿源| 婷婷五月天小说网| 五月丁香综合影院| 五月婷婷开心六月激情小说| 久久六月天| 97五月久久丁香婷婷| 婷婷五月色丁香在线看| 丁香五月天婷婷激情| 国产免费av在线| 激情色情五月天| 久久曰曰| 99久在线精品99re8| 人人播| 玖久久网站| 高清无码 一区 二区 三区| 99re免费精品视频| 99内射视频| 日日日天天干| 午夜天天精品视频| 亚洲综合视频天天精品| 五月婷婷av| www.maotanji.com| 精品人妻久久久久久| 超碰97在线观看免费| 丁香五月婷婷六月婷| 成年人丁香五月| 婷婷99中文字幕| a久久| 久久天堂精品| 直接看的AV| 9色小视频在线观看| 色久免费| 男女啪啪做爰高潮无遮挡 | 婷婷六月丁| 97碰免费视频在线| 色婷婷888| 99九九在线精品热动漫| 丁香五月AV| 碰碰操91| 天天综合五月天| 欧美激情中文字幕| 久久久久人妻| 久久丁香社| 天天搞天天爽| 黑人无码一区| 亚洲情色一区| 国产精品视频免费看| 日本色久| 久久婷婷内射| 丁香婷婷大香蕉| site:hcxsz888.com| 婷婷五月综合在线| 麻豆观看夏晴子| 精品A√|