国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

2021-09-06 13:57JohnHany C/C++

這篇文章主要介紹了Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

平時習慣了在Linux環(huán)境寫C++,有時候切換到Windows想繼續(xù)在同一個項目上工作,重新配置環(huán)境總是很麻煩。雖然Windows下用Visual Studio寫C++只需要雙擊個圖標,但我還是想折騰一下VS Code的環(huán)境配置。原因主要有兩點:一是個人習慣上各種語言都在VS Code里面寫,利用Git同步代碼可以很方便地在不同平臺開發(fā)同一個項目;二是有些情形下無法使用圖形化界面,比如為Git配置CI(持續(xù)性集成)時顯然不能用Visual Studio這個圖形化的IDE來執(zhí)行Windows環(huán)境的測試。

本文涉及的環(huán)境和工具版本:

  • Windows 10
  • VS Code1.45.0
  • C/C++(ms-vscode.cpptools)插件0.28.0.insider3
  • CMake(twxs.cmake)插件0.0.17
  • CMake Tools(ms-vscode.cmake-tools)插件1.3.1
  • Visual Studio IntelliCode(visualstudioexptteam.vscodeintellicode)插件1.2.7
  • Visual Studio Community 2019 (需要調(diào)用VS提供的MSVC編譯工具,以及相應的頭文件和庫文件)
  • CMake3.17.2
  • Ninja 1.10.0
  • Boost1.73.0

主要內(nèi)容

1 創(chuàng)建C++項目

2 安裝Visual Studio

3 安裝CMake和Ninja

4 下載和編譯Boost

4.1 Command Prompt的使用

4.2 編譯Boost

5 命令行編譯和測試

6 配置VS Code

6.1 settings.json

6.2 c_cpp_properties.json

6.3 tasks.json

6.4 launch.json

6.5 CMakeLists.txt

6.6 編譯、測試和調(diào)試

創(chuàng)建C++項目

VSCode及插件的安裝過程本文暫不介紹,這里直接給出項目的文件結構和代碼。

項目結構如下。 .vscode 文件夾里面的3個json文件用來配置VS Code,第二個文件夾里面包含對LeetCode某一個問題的解答( solution.hppsolution.cpp ), solution_test.cpp 用來執(zhí)行單元測試。最下面的 CMakeLists.txt 文件用來配置CMake,給出項目的編譯規(guī)則。

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

這里先給出C++部分的代碼,其他文件的內(nèi)容會在后面給出。

solution.hpp

  1. #ifndef SOLUTION_HEADER
  2. #define SOLUTION_HEADER
  3. #include <iostream>
  4. #include <vector>
  5. #include <unordered_set>
  6. using namespace std;
  7. class Solution {
  8. public:
  9. vector<int> intersection(vector<int>& nums1, vector<int>& nums2);
  10. };
  11. #endif
  12. solution.cpp
  13. #include "solution.hpp"
  14. static auto x = []() {
  15. // turn off sync
  16. std::ios::sync_with_stdio(false);
  17. // untie in/out streams
  18. cin.tie(NULL);
  19. return 0;
  20. }();
  21. vector<int> Solution::intersection(vector<int>& nums1, vector<int>& nums2) {
  22. if (nums1.size() > nums2.size())
  23. swap(nums1, nums2);
  24. unordered_set<int> A(nums1.begin(), nums1.end()), C;
  25. for (auto& i : nums2) {
  26. if (A.find(i) != A.end())
  27. C.insert(i);
  28. }
  29. return vector<int>(C.begin(), C.end());
  30. }

solution.cpp

  1. #include "solution.hpp"
  2.  
  3. static auto x = []() {
  4. // turn off sync
  5. std::ios::sync_with_stdio(false);
  6. // untie in/out streams
  7. cin.tie(NULL);
  8. return 0;
  9. }();
  10.  
  11. vector<int> Solution::intersection(vector<int>& nums1, vector<int>& nums2) {
  12. if (nums1.size() > nums2.size())
  13. swap(nums1, nums2);
  14. unordered_set<int> A(nums1.begin(), nums1.end()), C;
  15. for (auto& i : nums2) {
  16. if (A.find(i) != A.end())
  17. C.insert(i);
  18. }
  19. return vector<int>(C.begin(), C.end());
  20. }

solution_test.cpp

  1. #define BOOST_TEST_MODULE SolutionTest
  2.  
  3. #include "solution.hpp"
  4. #include <boost/test/unit_test.hpp>
  5.  
  6. BOOST_AUTO_TEST_SUITE(SolutionSuite)
  7.  
  8. BOOST_AUTO_TEST_CASE(PlainTest1)
  9. {
  10. vector<int> nums1{1,2,2,1};
  11. vector<int> nums2{2,2};
  12. vector<int> results = Solution().intersection(nums1, nums2);
  13.  
  14. vector<int> expected{2};
  15.  
  16. sort(results.begin(), results.end());
  17. sort(expected.begin(), expected.end());
  18. BOOST_CHECK_EQUAL_COLLECTIONS(results.begin(), results.end(), expected.begin(), expected.end());
  19. }
  20.  
  21. BOOST_AUTO_TEST_CASE(PlainTest2)
  22. {
  23. vector<int> nums1{4,9,5};
  24. vector<int> nums2{9,4,9,8,4};
  25. vector<int> results = Solution().intersection(nums1, nums2);
  26.  
  27. vector<int> expected{9,4};
  28.  
  29. sort(results.begin(), results.end());
  30. sort(expected.begin(), expected.end());
  31. BOOST_CHECK_EQUAL_COLLECTIONS(results.begin(), results.end(), expected.begin(), expected.end());
  32. }
  33.  
  34. BOOST_AUTO_TEST_SUITE_END()

安裝Visual Studio

這里不詳述VS的安裝過程,只是提示一下需要安裝的組件。

需要注意Visual Studio Community 2019 Preview版本在編譯Boost不能被正確識別,需要安裝正式版。Visual Studio Community 2017/2019 兩個版本我都試驗過,這里以2019版本為例。

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

只需要安裝“使用C++的桌面開發(fā)”這一套組件就可以了。

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

安裝CMake和Ninja

CMake可以下載名為cmake-3.17.2-win64-x64.msi 的安裝包來安裝,Ninja下載之后只有一個可執(zhí)行文件,可以隨意放在一個目錄下。

安裝過程暫不詳述,只需要注意安裝完成之后要設置一下環(huán)境變量。

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

設置好環(huán)境變量之后,可以重新打開命令行工具或終端,檢查一下CMake和Ninja的版本,看是否設置成功。

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

下載和編譯Boost

Boost可以從這個鏈接下載: https://dl.bintray.com/boostorg/release/1.73.0/source/  ,然后解壓到某個目錄下。

Boost本身是header-only的,即大部分情況下只需要包含其頭文件就能直接調(diào)用。但為了便于把我們自己的程序鏈接到Boost的單元測試模塊(Boost.Test),這里需要編譯一下Boost,產(chǎn)生靜態(tài)庫文件。

Command Prompt的使用

由于我們之前已經(jīng)安裝了Visual Studio以及在Windows平臺編譯C++所需的編譯工具和依賴庫,所以我們可以直接利用VS提供的環(huán)境來編譯Boost。

在開始菜單的“Visual Studio 2019”目錄下可以發(fā)現(xiàn)幾個命令行工具,我們可以打開一個名為“x64 Native Tools Command Prompt for VS 2019”的命令行工具,這個圖標在硬盤上對應到 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat 這個腳本。該腳本的作用是把MSVC和Windows SDK的包含路徑、庫路徑等添加到環(huán)境變量,然后打開一個cmd命令行。所以在這個cmd運行期間能夠直接檢測到編譯C++所需的所有依賴項。

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

我們可以試著在這個cmd當中輸入 SET ,查看已經(jīng)生效的所有環(huán)境變量。

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

利用這些信息,我們在常規(guī)的cmd或PowerShell里也能正常編譯C++代碼。具體的過程會在后面介紹。

默認cmd的字體有點難看,我個人習慣在Windows Terminal 里面開一個cmd終端,然后執(zhí)行下面的命令:

> "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"

這就可以讓我們的新終端也能夠檢測到MSVC環(huán)境,如下圖所示。

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

編譯Boost

然后, cd 到Boost的根目錄,執(zhí)行下面的命令:

  1. > bootstrap.bat
  2. > b2 --prefix=build install

等待編譯完成之后,在 build\lib 目錄下會出現(xiàn)一大堆 .lib 文件,我們只會用到 libboost_unit_test_framework-vc142-mt-gd-x64-1_73.lib 這一個文件。

當然,如果只想編譯單元測試模塊,可以用下面的命令:

  1. > b2 address-model=64 architecture=x86
  2. --with-test link=static --prefix=build install

命令行編譯和測試

這里我們先在命令行里編譯C++項目,并運行單元測試。 cd 到項目目錄下,然后執(zhí)行以下命令:

  1. > mkdir build
  2. > cd build
  3. > cmake -G "Ninja" ..
  4. > ninja test_main
  5. > test_main.exe

在Windows平臺上,生成工具可以選擇VS提供的NMAKE,也可以用Ninja。微軟的NMAKE類似于Linux平臺的make工具。按照這個 視頻 的介紹,Ninja的編譯速度要比NMAKE快一些。

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

可以發(fā)現(xiàn),在 vcvars64.bat 所提供的環(huán)境下,使用的是VS所安裝的CMake和Ninja,版本號比我們自己安裝都要老一些。下面我們介紹如何在VS Code中配置C++的編譯和測試環(huán)境。

配置VS Code

settings.json

打開VS Code的設置,在 settings.json 中添加下面幾行內(nèi)容,可以起到類似 vcvars64.bat 的作用:

  1. {
  2. "terminal.integrated.shell.windows": "C:\\Windows\\System32\\cmd.exe",
  3. "terminal.integrated.env.windows": {
  4. "PATH" : "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\Hostx64\\x64;C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.18362.0\\x64;E:\\CMake\\bin;E:\\dev-lib\\ninja",
  5. "INCLUDE": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\include;C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt",
  6. "LIB": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\ATLMFC\\lib\\x64;C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\lib\\x64;C:\\Program Files (x86)\\Windows Kits\\10\\lib\\10.0.18362.0\\ucrt\\x64;C:\\Program Files (x86)\\Windows Kits\\10\\lib\\10.0.18362.0\\um\\x64"
  7. },
  8. "cmake.cmakePath": "E:\\CMake\\bin\\cmake.exe"
  9. }

c_cpp_properties.json

這里給出Linux和Windows兩個平臺的配置。

  1. {
  2. "configurations": [
  3. {
  4. "name": "Linux",
  5. "includePath": [
  6. "${workspaceFolder}/**"
  7. ],
  8. "defines": [],
  9. "compilerPath": "/usr/bin/clang++",
  10. "cStandard": "c11",
  11. "cppStandard": "c++17",
  12. "intelliSenseMode": "clang-x64"
  13. },
  14. {
  15. "name": "Win32",
  16. "includePath": [
  17. "${workspaceFolder}/**",
  18. "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\include",
  19. "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\ATLMFC\\include",
  20. "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt",
  21. "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\shared",
  22. "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\um",
  23. "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\winrt",
  24. "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\cppwinrt",
  25. "E:\\dev-lib\\boost_1_73_0"
  26. ],
  27. "defines": ["_DEBUG", "UNICODE", "_UNICODE"],
  28. "windowsSdkVersion": "10.0.18362.0",
  29. "compilerPath": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\Hostx64\\x64\\cl.exe",
  30. "cStandard": "c11",
  31. "cppStandard": "c++17",
  32. "intelliSenseMode": "msvc-x64"
  33. }
  34. ],
  35. "version": 4
  36. }

tasks.json

前兩個 task 是Linux環(huán)境的(第一個是清空build目錄,第二個是配置CMake),第三個 task 是Windows下配置CMake的。

  1. {
  2. // See https://go.microsoft.com/fwlink/?LinkId=733558
  3. // for the documentation about the tasks.json format
  4. "version": "2.0.0",
  5. "tasks": [
  6. {
  7. "label": "clean",
  8. "type": "shell",
  9. "command": "rm -r build/*"
  10. },
  11. {
  12. "label": "configure",
  13. "type": "shell",
  14. "command": "cmake",
  15. "args": [
  16. "--no-warn-unused-cli",
  17. "-DCMAKE_C_COMPILER=/usr/bin/clang",
  18. "-DCMAKE_CXX_COMPILER=/usr/bin/clang++",
  19. "-DCMAKE_EXPORT_COMPILE_COMMANDS=TRUE",
  20. "-DCMAKE_BUILD_TYPE=Debug",
  21. "-H${workspaceFolder}",
  22. "-B${workspaceFolder}/build",
  23. "-G'Unix Makefiles'"
  24. ]
  25. },
  26. {
  27. "label": "MSVC configure",
  28. "type": "shell",
  29. "command": "cmake",
  30. "args": [
  31. "-H${workspaceFolder}",
  32. "-B${workspaceFolder}/build",
  33. "-GNinja"
  34. ]
  35. }
  36. ]
  37. }

launch.json

第一個是在Linux用 gdb 調(diào)試,第二個是在Linux下用 lldb 調(diào)試,第三個是在Windows用MSVC的 cl.exe 調(diào)試。

  1. {
  2. "version": "0.2.0",
  3. "configurations": [
  4. {
  5. "name": "(gdb) Launch",
  6. "type": "cppdbg",
  7. "request": "launch",
  8. "program": "${workspaceFolder}/build/test_main",
  9. "args": [],
  10. "stopAtEntry": false,
  11. "cwd": "${workspaceFolder}",
  12. "environment": [],
  13. "externalConsole": true,
  14. "MIMode": "gdb",
  15. "setupCommands": [
  16. {
  17. "description": "Enable pretty-printing for gdb",
  18. "text": "-enable-pretty-printing",
  19. "ignoreFailures": true
  20. }
  21. ]
  22. },
  23. {
  24. "name": "(lldb) Launch",
  25. "type": "lldb",
  26. "request": "launch",
  27. "program": "${workspaceFolder}/build/test_main",
  28. "args": [],
  29. },
  30. {
  31. "name": "(cl) Launch",
  32. "type": "cppvsdbg",
  33. "request": "launch",
  34. "program": "${workspaceFolder}\\build\\test_main.exe",
  35. "args": [],
  36. "stopAtEntry": false,
  37. "cwd": "${workspaceFolder}",
  38. "environment": [],
  39. "externalConsole": false,
  40. }
  41. ]
  42. }

CMakeLists.txt

這個CMake腳本也是跨平臺的,自動識別Linux或Windows,然后執(zhí)行相應的鏈接。

  1. cmake_minimum_required (VERSION 3.5)
  2. project(leetcode)
  3.  
  4. set(PROBLEM_NAME "349-Intersection-of-Two-Arrays-set")
  5.  
  6. set(CMAKE_CXX_STANDARD 14)
  7.  
  8. set(SOLUTION_SOURCES ${PROJECT_SOURCE_DIR}/${PROBLEM_NAME}/solution.cpp)
  9. add_library(solution STATIC ${SOLUTION_SOURCES})
  10.  
  11. enable_testing()
  12.  
  13. set(TEST_SOURCES ${PROJECT_SOURCE_DIR}/${PROBLEM_NAME}/solution_test.cpp)
  14. set(TEST_LIBS solution)
  15.  
  16. add_executable(test_main ${TEST_SOURCES})
  17.  
  18. if(WIN32)
  19. message(STATUS "Detected Windows platform")
  20. set(BOOST_ROOT E:\\dev-lib\\boost_1_73_0)
  21. set(BOOST_LIBRARYDIR E:\\dev-lib\\boost_1_73_0\\build\\lib)
  22. set(Boost_USE_STATIC_LIBS ON)
  23. find_package(Boost REQUIRED COMPONENTS unit_test_framework)
  24.  
  25. target_link_libraries(test_main PRIVATE ${TEST_LIBS} Boost::boost Boost::unit_test_framework)
  26. elseif(UNIX)
  27. message(STATUS "Detected UNIX platform")
  28. find_package(Boost REQUIRED COMPONENTS unit_test_framework)
  29. add_library(boost_unit_test_framework STATIC IMPORTED)
  30. set_target_properties(boost_unit_test_framework PROPERTIES
  31. IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
  32.  
  33. target_link_libraries(test_main ${TEST_LIBS} boost_unit_test_framework)
  34. else()
  35. message(FATAL_ERROR "Unsupported platform")
  36. endif()
  37.  
  38. add_test(solution_test test_main COMMAND test_main)

編譯、測試和調(diào)試

按快捷鍵 Ctrl + Shift + P ,然后就可以輸入我們之前定義的不同命令了:

  • “CMake: Configure” – 配置CMake
  • “CMake: Build” – 編譯項目
  • “CMake: Run tests” – 執(zhí)行測試
  • “Tasks: Run task -> MSVC configure” – 以調(diào)用Task的方式配置CMake

單元測試的效果如下圖所示:

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

調(diào)試的效果如下圖所示:

Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)

完整的項目代碼在我的GitHub上: https://github.com/johnhany/leetcode  。關于Linux平臺下C++開發(fā)環(huán)境的配置可以參考 《Ubuntu計算機視覺開發(fā)環(huán)境配置(Python/C++)》 。

總結

到此這篇關于Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)的文章就介紹到這了,更多相關VScode配置C/C++環(huán)境內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:http://johnhany.net/2020/05/vscode-cmake-ninja-boost-test-cpp-on-windows/

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言實現(xiàn)電腦關機程序

    C語言實現(xiàn)電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    strcpy 和strcnpy函數(shù)是字符串復制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網(wǎng)7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內(nèi)存中的數(shù)據(jù)都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經(jīng)典實例之模擬計算器示例代碼

    C/C++經(jīng)典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經(jīng)典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現(xiàn)同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: 免费激情网站 | 精品在线视频一区 | 亚洲午夜免费视频 | 国产精品爱久久久久久久 | 男人的天堂久久 | 亚洲欧美日韩在线 | 中文字幕av亚洲精品一部二部 | 午夜成人免费影院 | 看国产到性色 | 久操资源 | 亚洲一区精品在线 | 亚洲精品在线中文字幕 | 国产日韩精品视频 | 日韩免费电影 | 国产成人99久久亚洲综合精品 | 日韩精品一区二区三区在线观看 | 玖玖精品 | 国产精品一码二码三码在线 | 中文字幕1区 | 国产黄| 综合在线视频 | 欧美午夜一区二区三区免费大片 | 久久久性色精品国产免费观看 | 欧美成人午夜视频 | 久久九九国产精品 | 国产美女一区 | 中文字幕在线精品 | 日韩在线欧美 | 日本高清中文字幕 | 天天草夜夜 | 国产精品久久久久久a | 日韩在线免费观看视频 | 人人爱人人爽 | 欧美日韩中文在线观看 | 国外成人在线视频网站 | 欧美日韩美女 | av一区二区在线观看 | 久久精品一区二区三区四区 | 国产高清视频 | 黄色电影免费在线观看 | jvid精品资源在线观看 |