Clion使用vcpkg管理C/C++包

news/2024/9/28 9:45:43/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、Clion安装vcpkg
  • 二、使用步骤
    • 1.切换到清单模式
    • 2.开始安装包
  • 三、测试代码
  • 总结


前言

Linux上的库基本都可以通过aptyum等包管理工具来在线安装包,好用是真的好用,无独有偶,windows上也有类似的包管理工具,那就是今天的主角vcpkg,用好vcpkg可以省很多事。

vcpkg可以单独使用,也可以集成到IDE,今天就基于Clion讲解。


一、Clion安装vcpkg

Clion提供了一整套vcpkg的安装方法,可以说一气呵成。虽说vcpkg也可以单独使用,但是集成到ide无疑是最优解,它可以和很多ide集成,今天先介绍Clion。

前提条件:

本次演示需要预装VS2019,因为我的电脑上预装了VS2019导致vcpkg自动找到了VS2019的工具链,最终编译出来的库都是基于VS的,如果你使用MingW的工具链会导致无法链接的错误。

另外,需要在Clion里面配置VS2019的工具链:

在这里插入图片描述

如果你和我的环境很像,你可以继续往下;如果你没有预装VS2019你依然可以继续,我现在还不能确定是不是优先级的问题,只要引入vcpkg不报错就可以正常使用。

VS是我必然需要的环境,我不可能卸载或重配置它,所以有些东西无法验证。但是,只要你和我差不多环境,哪怕是VS2022你应该都是可以的。

首先、打开Clion

其次、依次找到View->Tool Windows->Vcpkg

在这里插入图片描述

这个时候底部工具栏就有Vcpkg了。
在这里插入图片描述

最后、点击底部工具栏上的vcpkg开始配置vcpkg。

在这里插入图片描述

接着,点击左上角的+添加repository,我这里提前拉取了github的存储库到gitee,大家可以克隆我的存储库,方便了不能访问github的同学。

Vcpkg国内存储库

按照我的配置添加:

在这里插入图片描述

Name:名称,最好英文,最好不要有空格
URL:替换成我给的国内存储库
Directory:安装目录,找一个空间足够的地方,谨慎放在C盘,因为需要源代码编译产生大量中间文件,占用大量的磁盘空间;最好不要有空格

Add vcpkg:建议勾上,创建一个空白项目,学习下Vcpkg是如何集成到项目中的

二、使用步骤

安装完成之后需要切换到Menifest Mode,就是清单模式,这个时候就可以开始管理包了。

1.切换到清单模式

如果你不在清单模式,点击右上角的{}切换到清单模式,如果已经在了,就不需要切换了。

在这里插入图片描述

2.开始安装包

进入清单模式后,你就可以看到右边有个列表,还有个搜索框,然后列表里分为Added(已经成功添加到项目)All(所有签名的包)
在这里插入图片描述

为了说清楚这个问题我们以boost为例:

搜索框输入boost,可以看到有了结果,说明找到了包:

在这里插入图片描述

这里注意下:我已经把boost-coroutine2添加到项目中了,所以可以看到Added列表里出现了boost-coroutine2,就不用重复添加了。

这里需要特别说明下:boost这个库比较特殊,它是分模块的,我这里说的分模块是真正意义上的分模块,指的是它可以在vcpkg里面单独管理每个模块,更准确地说分包比较合适。像ffmpeg虽然也分成avformat和avutil等模块,但是它不能在vcpkg里面单独安装,这一点还是需要注意下。

话说回来,就拿boost-coroutine2举例,我们都知道C++ STD真正开始支持协程是从C++20开始的,如果我们是基于C++17呢,我不想升级到C++20,我就可以通过使用boost来开发协程,这是很好的另辟蹊径的方法。

在这里插入图片描述

先搜索到我们需要的包boost-coroutine2,点击右边的Add to vcpkg.json,等待下载编译完成。当编译完成的时候它的库会安装到你的项目目录里面,比如cmake-build-debug\vcpkg_installed\x64-windows。接着会自动Reload Cmake配置,这个时候你需要去底部工具栏的Cmake条目里去找,它会告诉你怎么引用新安装的包。

在这里插入图片描述

注意:我测试过的包都提供了find_packages的方法,像ffmpeg本身是基于pfgconfig管理的,在unix上是不能直接使用find_packages找到的,但是,vcpkg可以!另外,像ffmpeg这样的包通过pkgconfig间接找到在vcpkg里面也是可以用的。

我不知道是不是所有的vcpkg包都提供了这个方法,但是我用过的都是有的。最终你还是按照vcpkg提供的引用方法最稳妥。

最后的最后,这个时候就可以开始写代码测试了。

注意:也有可能没有你要的包,vcpkg支持的包大概2000多个,平常使用足够了!

三、测试代码

boost-coroutine2为例,安装方式前面说过了,下面直接提供测试代码:

Boost.cpp

#include <iostream>
#include <boost/coroutine2/all.hpp>void int_generator(boost::coroutines2::coroutine<int>::push_type &yield) {for (int i = 1; i <= 5; ++i) {yield(i);}
}int main() {boost::coroutines2::coroutine<int>::pull_type source(int_generator);for (auto value: source) {std::cout << "Generated value: " << value << std::endl;}return 0;
}

CmakeLists.txt

cmake_minimum_required(VERSION 3.27)set(CMAKE_TOOLCHAIN_FILE D:/Work/vcpkg/scripts/buildsystems/vcpkg.cmake)project(Hello)set(CMAKE_CXX_STANDARD 17)find_package(boost_coroutine2 REQUIRED CONFIG)
add_executable(Boost Boost.cpp)
target_link_libraries(Boost PRIVATE Boost::coroutine2)

注意这句set(CMAKE_TOOLCHAIN_FILE D:/Work/vcpkg/scripts/buildsystems/vcpkg.cmake),必须在project()之前引入vcpkg,CMAKE_TOOLCHAIN_FILE的值就是我最开始说的安装目录。

注意:这个地方的路径要使用类Unix的正斜杠,不要使用Windows的反斜杠,仔细看我的写法!

编译+执行即可。


总结

1、总体我觉得是很好的,配置比apt麻烦点,但至少解决了缺乏包管理器的问题
2、像那些诞生于类Unix的包比如ffmpeg在windows上也可以直接使用了,如果自己编译的话麻烦不小。
3、vppkg不是万能的,比如opencv,如果你想添加自己的代码或自定义就行不通了,终究还是要自己动手。


http://www.ppmy.cn/news/1530629.html

相关文章

Error: one input ui-file must be specified(问题已解决)

一、 项目场景问题描述 Error: one input ui-file must be specified pycharm IDE添加了外部工具。 QT Designer设计完成&#xff0c;生成界面ui文件&#xff0c; 3.运行pyuic5转换文件 方式一&#xff1a;选中ui文件 方式二:右击选中.ui文件。 报错&#xff1a;Error: o…

【机器学习】Flux.jl 生态

官方API https://fluxml.ai/Flux.jl/stable/ecosystem/ 官网给出了 Flux’s model-zoo&#xff0c; 是一个庞大的案例库&#xff0c; 可以提供直观的参考&#xff0c; 并且还列举了基于 Flux.jl 开发的第三方库。 机器视觉 ObjectDetector.jl YOLO 抓取的“预备跑” 图像Met…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveZeroPosition

机器自动化控制器——第三章 轴指令 7 MC_MoveZeroPosition变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶指令的中止▶重启运动指令▶多重启动运动指令▶异常 MC_MoveZeroPosition 将绝对坐标“0”设为目标位置进行定位&#xff0c;返回原点。 指令名…

30个GPT提示词天花板,一小时从大纲到终稿

PROMPT 1 中文&#xff1a;构建研究背景与意义&#xff0c;阐述研究问题的紧迫性和重要性。 English: Establish the research background and significance, elucidating the urgency and importance of the research question. 中文&#xff1a;设计研究目的与目标&#xff…

Spring Boot 点餐系统:餐饮服务的未来

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上点餐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上点餐系统&#xff0c;它彻底改变了过去传统的…

Playerprefer类中的方法

一 PlayerPrefs是什么 是Unity提供的可以用于存储读取玩家数据的公共类 二 存储相关 PlayerPrefs的数据存储 类似于键值对存储 一个键对应一个值 提供了存储3种数据的方法 int float string 键: string类型 值&#xff1a;int float string 对应3种API Play…

C++——关联式容器(5):哈希表

7.哈希表 7.1 哈希表引入 哈希表的出现依旧是为了查找方便而设计的。在顺序结构中&#xff0c;查询一个值需要一一比较&#xff0c;复杂度为O(N)&#xff1b;在平衡树中&#xff0c;查询变为了二分查找&#xff0c;复杂度为O(logN)&#xff1b;而对于哈希表&#xff0c;我们可…

python划分CSV格式的数据集

编写一个 Python 函数&#xff0c;将 clusters.csv 文件&#xff0c;格式为&#xff1a;第一列为编号&#xff0c;第二列为聚类的代表序列&#xff0c;第三列为所有的其它同源序列&#xff0c;逗号隔开&#xff08;TM-align蛋白质聚类数据格式转化-CSDN博客&#xff09;&#x…