clion結合vcpkg以及GTest的使用

一、vcpkg簡介、下載和使用

1. vcpkg是什麼

vcpkg對於我們用戶來說相當於一個c++的包管理器,其他語言中類似的包管理器有:

  • Java:Maven
  • JavaScript:npm,yarn
  • python:pip

其實當我以前使用python或者Java時就深刻地感受到了包管理器的便利,而當時也沒怎麼聽說c++有比較好用的包管理器,而我也只是一年前才聽說過有vcpkg這個東西,但由於之前不太熟悉cmake如何編寫而作罷,而這學期的《計算機圖形學》課程需要按照OpenGL相關的庫,此時我第一次需要使用到vcpkg,也感受到了它的便利,故也編寫博客記錄一下。

2. vcpkg下載

GitHub鏈接://github.com/microsoft/vcpkg

clone url://github.com/microsoft/vcpkg.git

我們需要先將項目下載下來:

git clone //github.com/microsoft/vcpkg.git

然後執行:

.\bootstrap-vcpkg.bat

這個指令應該是到GitHub上去下載vcpkg對應的可執行文件

待它執行完之後,在項目中就會出現vcpkg.exe的可執行文件了

image-20210915221447283

這樣vcpkg即下載完成

3. 使用vcpkg下載第三方庫

當前vcpkg中有許多第三方庫,例如:boost、GTest、jsoncpp等等,我們可以使用以下的指令下載需要的庫:

vcpkg install 庫名

例如:

image-20210915221825603

當第三方庫下載好了,它就會提示當使用cmake進行構建項目時需要添加的腳本代碼。

二、clion結合vcpkg

雖然vcpkg是針對於Visual Studio編譯器的包管理器,但是感覺對比於clionvs有很多地方用得非常不順手(特別是對於使用過IntelliJ IDEA的同學),而且clion也可以選擇使用vs作為編譯環境,因此我這裡使用clion來使用vcpkg中的第三方庫。

1. 方法一:使用環境變量

先設置兩個環境變量:

VCPKG_ROOT:vcpkg文件夾目錄

VCPKG_DEFAULT_TRIPLET:x64-windows

image-20210915222624959
image-20210915222609971

然後在項目根目錄下的CmakeLists.txt中添加(位於c++標準聲明和project聲明之間):

# c++11
set(CMAKE_CXX_STANDARD 11)
...

# vcpkg <--
if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
  set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
      CACHE STRING "")
endif()
if(DEFINED ENV{VCPKG_DEFAULT_TRIPLET} AND NOT DEFINED VCPKG_TARGET_TRIPLET)
  set(VCPKG_TARGET_TRIPLET "$ENV{VCPKG_DEFAULT_TRIPLET}" CACHE STRING "")
endif()

# project
project(main)
...

2. 方法二:添加cmake指令【推薦】

先使用clion打開(或創建一個新的)cmake項目,點擊下方的【cmake】tab:

image-20210915223107664

然後將需要的命令填寫到下圖的文本框中:

image-20210915223232691

需要填寫的命令為:

-DCMAKE_TOOLCHAIN_FILE=<自己的vcpkg目錄>/scripts/buildsystems/vcpkg.cmake

例如:

image-20210915223416011

然後需要注意將編譯器切換為Visual Studio(兩種方法都需要切換),因為vcpkg實際上是針對Visual Studio的c++包管理器,因此許多第三方庫只有使用vs編譯環境才能成功運行(經測試GTest和Boost.test使用mingw編譯運行失敗)

image-20210915223908940

三、clion通過vcpkg使用GTest

1. GTest簡介

GTest的全稱是Google Test,是谷歌開發的一套針對c++的單元測試庫。

之前開發Java時就已經接觸過Junit了,當時就覺得單元測試真是太方便了,對於我這樣的初級開發者而言,單元測試只是多幾個程序執行入口而已,但確實非常便於編寫小端的代碼筆記和測試較小的模塊

2. GTest配置

首先先使用vcpkg install gtestgtest庫下載下來

然後會發現命令行中出現這樣的提示:

The package gtest:x64-windows provides CMake targets:

    find_package(GTest CONFIG REQUIRED)
    target_link_libraries(main PRIVATE GTest::gmock GTest::gtest GTest::gmock_main GTest::gtest_main)

後面的兩行命令我們直接粘貼到CMakeLists.txt中的末尾即可:

add_executable(main ...)
...

find_package(GTest CONFIG REQUIRED)
target_link_libraries(main PRIVATE GTest::gtest GTest::gtest_main)

注意這裡的target_link_libraries中我去掉了gmock相關的配置,因為他們兩個同時鏈接會發生衝突,而且一般我們使用兩者其一即可。

3. GTest的簡單使用

main.cpp中編寫:

#include <iostream>
#include <gtest/gtest.h>
using namespace std;

TEST(TestCase, t1) {
    cout << "hello world" << endl;
}

然後會發現clion中有和IDEA一樣人性化的運行按鈕:

image-20210915225001608

然後我們即可運行測試代碼塊了:

image-20210915225044714

運行效果:

image-20210915225122610

當然,GTest中還有許多非常強大的功能,但我現在還用不到,當前我只需要個測試入口log一些測試信息就好了haha。

tips:和這裡介紹的GTest庫的使用一樣,其他的第三方庫按照這個流程配置好即可成功運行,例如boost、jsoncpp等等,個人覺得vcpkg唯一不足的地方就是綁定了vs編譯環境,很多庫無法使用mingw環境編譯運行。

Tags: