目录
2.自定义vcpkg.json文件指定opencv依赖库中ffmpeg编译版本
4.vcpkg.json添加编译依赖库以及给依赖库添加编译依赖库
一、官网下载vcpkg
GitHub - microsoft/vcpkg: C++ Library Manager for Windows, Linux, and MacOS
windows下PowerShell(或双击)执行./bootstrap-vcpkg.bat
linux下运行./bootstrap-vcpkg.sh
二、编译步骤
1.正常指令编译
vcpkg目录下直接执行以下命令 安装的是windows下x86依赖ffmpeg的opencv动态库
./vcpkg install opencv[ffmpeg]:x86-windows-static
此处执行后会观察到编译库中使用的是最新的opencv源码以及ffmpeg源码
可以看到我的opencv版本为4.8.0,ffmpeg版本为6.1.1,而根据官方opencv源码可以看到其依赖三方库ffmpeg版本为4.x。
opencv/3rdparty/ffmpeg/ffmpeg.cmake at 4.8.0 · opencv/opencv · GitHub
2.自定义vcpkg.json文件指定opencv依赖库中ffmpeg编译版本
查找了很多方法,最终决定用最简单的方法,直接拷贝vcpkg\ports\opencv\vcpkg.json到vcpkg目录下,这时候我们需要修改一下vcgkg.json
"name": "opencv",
"version": "4.8.0",
"port-version": 1,
"description": "Computer vision library",
"homepage": "https://github.com/opencv/opencv",
"license": "Apache-2.0",
"dependencies": [
{
"name": "opencv4",
"default-features": false
}
],
"default-features": [
"default-features"
],
以上是我直接复制的opencv中vcpkg.json前面一段的内容,接下来在json中添加overrides对象
"dependencies": [
{
"name": "opencv4",
"default-features": false
}
],
"overrides": [
{
"name": "ffmpeg",
"version": "4.4.3"
}
],
"default-features": [
"default-features"
],
将overrides加在这中间即可,放别的地方应该也可以,不过放在这比较方便修改,如果需要修改其他依赖库或者opencv自己的版本则在overrides对象数组里追加库名字和版本号就可以了。
其中vcpkg支持的依赖库版本号可以在vcpkg/versions目录下找到。
要选择修订版本的话在version下添加port-version对象即可,具体也可在versions目录下查看
3.通过自定义vcpkg.json进行编译
vcpkg x-update-baseline --add-initial-baseline
vcpkg目录下执行以上命令,如果vcpkg.json编写不规范会报错,执行成功则输出
PS D:\Software\vcpkg> vcpkg x-update-baseline --add-initial-baseline
updated registry 'https://github.com/microsoft/vcpkg': baseline '' -> '67a300519ea09dbf02b4d06982e781a01b617b93'
接着我们只要确定好要编译的环境和依赖库就可以进行编译了,以我的例子接着执行
./vcpkg install --x-feature=ffmpeg --triplet x86-windows-static
--x-feature=ffmpeg 为vcpkg.json中opencv的可选依赖库 用 vcpkg search 库名称 也可以看到
--triplert 为编译平台 支持的编译平台可以通过./vcpkg help triplet查看
其作用与正常指令编译opencv[ffmpeg]:x86-windows-static一致,此时我们可以看到输出
PS D:\Software\vcpkg> ./vcpkg install --x-feature=ffmpeg --triplet x86-windows-static
Detecting compiler hash for triplet x64-windows...
-- Automatically setting %HTTP(S)_PROXY% environment variables to "127.0.0.1:10809".
Compiler found: D:/Software/VS2022/Compilation/VC/Tools/MSVC/14.39.33519/bin/Hostx64/x64/cl.exe
Detecting compiler hash for triplet x86-windows-static...
Compiler found: D:/Software/VS2022/Compilation/VC/Tools/MSVC/14.39.33519/bin/Hostx64/x86/cl.exe
The following packages will be built and installed:
* ffmpeg[avcodec,avdevice,avfilter,avformat,core,swresample,swscale]:x86-windows-static@4.4.3 -- D:\Software\vcpkg\buildtrees\versioning_\versions\ffmpeg\7e5aad683e1959d2595ae4622e686cf35dbd9ea3
* flatbuffers:x64-windows@24.3.25 -- D:\Software\vcpkg\buildtrees\versioning_\versions\flatbuffers\f8e85b45608b4005d8e8b4a96cfe11a5c2686e92
* flatbuffers:x86-windows-static@24.3.25 -- D:\Software\vcpkg\buildtrees\versioning_\versions\flatbuffers\f8e85b45608b4005d8e8b4a96cfe11a5c2686e92
* libjpeg-turbo:x86-windows-static@3.0.2 -- D:\Software\vcpkg\buildtrees\versioning_\versions\libjpeg-turbo\6d061c71a48ca2abff5cf471f77ef14d7222aa52
* liblzma:x86-windows-static@5.4.4 -- D:\Software\vcpkg\buildtrees\versioning_\versions\liblzma\f285b7c4ffa2cc065c7c6fec4b61006f7fa2714e
* libpng:x86-windows-static@1.6.43#2 -- D:\Software\vcpkg\buildtrees\versioning_\versions\libpng\915cc8e8e0adbfb2708a310635217811a849d709
* libwebp[core,libwebpmux,nearlossless,simd,unicode]:x86-windows-static@1.4.0#1 -- D:\Software\vcpkg\buildtrees\versioning_\versions\libwebp\9d0c00119dd6ec04488b4e0c926aa3ae73b95847
opencv4[core,dnn,ffmpeg,jpeg,png,quirc,tiff,webp]:x86-windows-static@4.8.0#19 -- D:\Software\vcpkg\buildtrees\versioning_\versions\opencv4\85685a5e45ef916a21769da98c8346462ef179d0
然后就搞定了!如果想自己写vcpkg.json也可以,但是太麻烦我就懒得再试了。
4.vcpkg.json添加编译依赖库以及给依赖库添加编译依赖库
"default-features": {
"description": "Platform-dependent default features",
"dependencies": [
{
"name": "opencv4",
"default-features": false,
"features": [
"dnn",
"jpeg",
"png",
"quirc",
"tiff",
"webp"
]
},
vcpkg.json中在默认依赖中增加即可,或者用--x-feature的方式,但是ffmpeg依旧是编译默认的依赖库,具体可见ffmpeg中的vcpkg.json,我们只要在自定义vcpkg.json中加即可。
"ffmpeg": {
"description": "ffmpeg support for opencv",
"dependencies": [
{
"name": "opencv4",
"default-features": false,
"features": [
"ffmpeg"
]
},
{
"name": "ffmpeg",
"default-features": false,
"features": [
"avcodec",
"avdevice",
"avfilter",
"avformat",
"swresample",
"swscale",
"ffplay",
"freetype",
"iconv",
"lzma",
"opencl",
"opengl",
"openh264",
"openjpeg",
"openssl",
"postproc",
"sdl2",
"webp",
"x264",
"x265",
"xml2",
"zlib"
]
}
]
},
在opencv的可选依赖库features中ffmpeg部分dependencies添加ffmpeg编译依赖库,上面这段意思就是opencv依赖ffmpeg,ffmpeg则依赖下面追加的一堆库,默认的话只会有features中的前六个,虽然我现在还没用到这么多功能就是了,有没有编译到库可以在编译输出直接看到。
5.集成到Visual Studio
./vcpkg integrate install
运行以上指令就能在vs项目属性页的配置属性里面看到vcpkg
然后我们在安装路径设置成我们vcpkg安装的库就行了,正常使用指令安装是会安装在运行目录下installed文件夹,无需手动设置,使用自定义vcpkg.json则安装在vcpkg_installed目录下。
如果将vcpkg文件夹添加到了环境变量里面也可以在其余目录执行,生成库则在运行目录下
总结
记录一下编译过程,以下为参考链接
https://learn.microsoft.com/zh-cn/vcpkg/consume/lock-package-versions?tabs=inspect-powershell