一、vcpkg简介、下载和使用

1. vcpkg是什么

vcpkg对于我们用户来说相当于一个c++的包管理器,其他语言中类似的包管理器有:

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

其实当我以前使用python或者Java时就深刻地感受到了包管理器的便利,而当时也没怎么听说c++有比较好用的包管理器,而我也只是一年前才听说过有vcpkg这个东西,但由于之前不太熟悉cmake如何编写而作罢,而这学期的《计算机图形学》课程需要按照OpenGL相关的库,此时我第一次需要使用到vcpkg,也感受到了它的便利,故也编写博客记录一下。

2. vcpkg下载

GitHub链接:https://github.com/microsoft/vcpkg

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

我们需要先将项目下载下来:

  1. git clone https://github.com/microsoft/vcpkg.git

然后执行:

  1. .\bootstrap-vcpkg.bat

这个指令应该是到GitHub上去下载vcpkg对应的可执行文件

待它执行完之后,在项目中就会出现vcpkg.exe的可执行文件了

这样vcpkg即下载完成

3. 使用vcpkg下载第三方库

当前vcpkg中有许多第三方库,例如:boost、GTest、jsoncpp等等,我们可以使用以下的指令下载需要的库:

  1. vcpkg install 库名

例如:

当第三方库下载好了,它就会提示当使用cmake进行构建项目时需要添加的脚本代码。

二、clion结合vcpkg

虽然vcpkg是针对于Visual Studio编译器的包管理器,但是感觉对比于clionvs有很多地方用得非常不顺手(特别是对于使用过IntelliJ IDEA的同学),而且clion也可以选择使用vs作为编译环境,因此我这里使用clion来使用vcpkg中的第三方库。

1. 方法一:使用环境变量

先设置两个环境变量:

VCPKG_ROOT:vcpkg文件夹目录

VCPKG_DEFAULT_TRIPLET:x64-windows


然后在项目根目录下的CmakeLists.txt中添加(位于c++标准声明和project声明之间):

  1. # c++11
  2. set(CMAKE_CXX_STANDARD 11)
  3. ...
  4. # vcpkg <--
  5. if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
  6. set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
  7. CACHE STRING "")
  8. endif()
  9. if(DEFINED ENV{VCPKG_DEFAULT_TRIPLET} AND NOT DEFINED VCPKG_TARGET_TRIPLET)
  10. set(VCPKG_TARGET_TRIPLET "$ENV{VCPKG_DEFAULT_TRIPLET}" CACHE STRING "")
  11. endif()
  12. # project
  13. project(main)
  14. ...

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

先使用clion打开(或创建一个新的)cmake项目,点击下方的【cmake】tab:

然后将需要的命令填写到下图的文本框中:

需要填写的命令为:

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

例如:

然后需要注意将编译器切换为Visual Studio(两种方法都需要切换),因为vcpkg实际上是针对Visual Studio的c++包管理器,因此许多第三方库只有使用vs编译环境才能成功运行(经测试GTest和Boost.test使用mingw编译运行失败)

三、clion通过vcpkg使用GTest

1. GTest简介

GTest的全称是Google Test,是谷歌开发的一套针对c++的单元测试库。

之前开发Java时就已经接触过Junit了,当时就觉得单元测试真是太方便了,对于我这样的初级开发者而言,单元测试只是多几个程序执行入口而已,但确实非常便于编写小端的代码笔记和测试较小的模块

2. GTest配置

首先先使用vcpkg install gtestgtest库下载下来

然后会发现命令行中出现这样的提示:

  1. The package gtest:x64-windows provides CMake targets:
  2. find_package(GTest CONFIG REQUIRED)
  3. target_link_libraries(main PRIVATE GTest::gmock GTest::gtest GTest::gmock_main GTest::gtest_main)

后面的两行命令我们直接粘贴到CMakeLists.txt中的末尾即可:

  1. add_executable(main ...)
  2. ...
  3. find_package(GTest CONFIG REQUIRED)
  4. target_link_libraries(main PRIVATE GTest::gtest GTest::gtest_main)

注意这里的target_link_libraries中我去掉了gmock相关的配置,因为他们两个同时链接会发生冲突,而且一般我们使用两者其一即可。

3. GTest的简单使用

main.cpp中编写:

  1. #include <iostream>
  2. #include <gtest/gtest.h>
  3. using namespace std;
  4. TEST(TestCase, t1) {
  5. cout << "hello world" << endl;
  6. }

然后会发现clion中有和IDEA一样人性化的运行按钮:

然后我们即可运行测试代码块了:

运行效果:

当然,GTest中还有许多非常强大的功能,但我现在还用不到,当前我只需要个测试入口log一些测试信息就好了haha。

tips:和这里介绍的GTest库的使用一样,其他的第三方库按照这个流程配置好即可成功运行,例如boost、jsoncpp等等,个人觉得vcpkg唯一不足的地方就是绑定了vs编译环境,很多库无法使用mingw环境编译运行。

clion结合vcpkg以及GTest的使用的更多相关文章

  1. 使用clion+cmake+vcpkg的开发现代的c++跨平台程序

    使用clion+cmake+vcpkg的开发现代的c++跨平台程序 使用c++开发跨平台的程序 背景 在开发过程中,使用c++作为开发语言,通常被认为是痛苦的,啰嗦的,超长开发时间的.最近几年有各种各 ...

  2. 使用gtest(googletest)进行c++单元测试

    这是系列文章的第三篇,前两篇https://www.cnblogs.com/gaopang/p/11243367.html和https://www.cnblogs.com/gaopang/p/1158 ...

  3. CLion之C++框架篇-优化框架,单元测试(二)

    背景   结合上一篇CLion之C++框架篇-安装工具,基础框架的搭建(一),继续进行框架优化!   googletest(GTest)是Google开源的C++测试框架,与CLion组合,对C++环 ...

  4. 使用c++开发跨平台的程序

    使用c++开发跨平台的程序 背景 在开发过程中,使用c++作为开发语言,通常被认为是痛苦的,啰嗦的,超长开发时间的.最近几年有各种各样的语言被广泛使用,相对比来说c++不是那么出彩.c++虽然年龄大, ...

  5. C/C++ 大型工程工具链搭建

    一.配置环境要求 C/C++ 编译器 此项有系统区别,如果是 Windows 平台,那么可以下载 VS2022 社区版,它自带 MSVC 编译器.如果嫌它太笨重,也可以直接下载 MSVC 再发行组件. ...

  6. 在Clion里链接gtest

    本来以为像之前链接boost一样,加个链接路径就好了,没想到报找不到gtest的符号,搞了半天,没弄明白啥原因. 网上也没搜到好方法,只能把gtest的源码加到项目里,然后在链接了. CMake配置如 ...

  7. 使用CLion编辑C工程

    最近正在研究Linux C代码编辑器,确实也不太喜欢SI(Windows看代码还行,编辑一般,同步麻烦), 尝试使用CLion,但对makefile工程支持不好,怎么编译还没搞懂, 阅读.编辑还不错, ...

  8. CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)

      背景   结合上一篇CLion之C++框架篇-优化框架,引入boost(三),继续进行框架优化!在项目中,我们经常会通过get方式拉取第三方资源,这一版优化引入类库curl,用来拉取第三方资源库. ...

  9. 图解安装CLion编写程序并进行单元测试

    我对JetBrains公司的IDE情有独钟,于是这里使用的IDE是CLion,CLion是以IntelliJ为基础,专为开发C及C++所设计的跨平台IDE,可以在Windows.Linux及MacOS ...

随机推荐

  1. jmeter参数化时, 中文乱码问题的解决

    参数化文件中文乱码, 可在"CSV数据文件设置"将编码改为"GB2312"即可

  2. TCP实现聊天

    TCP实现聊天 IO流关闭是简写的,正常写要判断是否为null 客户端:(最好捕获异常) 1.连接服务器Socket 2.发送消息 package net.TCPChat; import java.i ...

  3. 使用Windows客户端连接Linux系统中的MySQL时产生的错误已经解决

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  4. GO Time 类型方法处理集合

    1.判断2个时间是否超时 package main import ( "fmt" "time" ) func main() { //获取1秒后时间 var No ...

  5. spring学习06(AOP)

    9.AOP 什么是AOP AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...

  6. SpringBoot开发十-开发登录,退出功能

    需求介绍-开发登录,退出功能 访问登录页面:点击头部区域的链接打开登录页面 登录: 验证账号,密码,验证码 成功时生成登录凭证发放给客户端,失败时跳转回登录页面 退出: 将登录状态修改为失效的状态 跳 ...

  7. 【原创】一文彻底搞懂安卓WebView白名单校验

    前言 近两年公司端侧发现的漏洞很大一部分都出在WebView白名单上,针对这类漏洞安全编码团队也组织过多次培训,但是这种漏洞还是屡见不鲜.下面本人就结合产品中容易出现问题的地方,用实例的方式来总结一下 ...

  8. MySQL为什么不支持中文排序?

    前言 或许都知道,MySQL不支持中文排序,这样的说法可以说对也可以说也不对.接下来我们分析一下: 首先执行命令,查看编码集: SHOW VARIABLES LIKE 'character_set%' ...

  9. Java - Enum 枚举类型

    目录 前言 应用 定义 基本Enum特性 Enum的静态导入 Enum中添加新方法 Switch语句中的Enum Enum的继承 EnumSet的使用 EnumMap的使用 常量相关方法 枚举值向枚举 ...

  10. Longhorn,企业级云原生容器分布式存储 - 监控(Prometheus+AlertManager+Grafana)

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...