提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、Clion安装vcpkg
- 二、使用步骤
- 1.切换到清单模式
- 2.开始安装包
- 三、测试代码
- 总结
前言
Linux
上的库基本都可以通过apt
或yum
等包管理工具来在线安装包,好用是真的好用,无独有偶,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,如果你想添加自己的代码或自定义就行不通了,终究还是要自己动手。