小记最近干了些什么的碎碎念

碎碎念

关于OpenCV带FFmpeg支持的编译

很早之前做过一个OpenCV的毕业项目.链接.里面有一个明显没有处理好的点就是其运行需要外置命令ffmpeg可用:

alt text

这是一个非常抽象的问题,当时就发现是因为编译的OpenCV没有FFmpeg支持,但是碍于不可抗力因素又不得不搁置,最近突然想起来了就又试着做了一下.

首先是关于源代码问题,早期OpenCV是可以很好的编译FFmpeg支持的,当时FFmpeg用的还是make系统,后来FFmpeg的构建文件经历了爆改,导致很长一段时间内编译带FFmpeg支持的OpenCV相当复杂困难,不过到现在,这个问题已经很好地解决了.

你可以直接在OpenCV的Github Release页面下载到源代码,比如4.10.0,这个源代码不分平台的,都可以编译成功.

然后是FFmpeg,因为我是在Windows平台进行的开发,所以要去下载Windows版本的,并且因为要手动编译OpenCV,FFmpeg应该要带上includelib文件.

FFmpeg Download找到Windows的gyan.dev镜像,下载Release的essentials版本:

alt text

里面的目录结构如下:

alt text

然后进到OpenCV源代码目录,新建build目录.新建一个目录其实是大型Cmake项目的一贯做法,但是我以前用Cmake就是喜欢直接源代码里构建(T_):

1
2
mkdir build
cd build

接下来调整Cmake的参数,我在Windows平台直接用的MinGW进行构建:

1
2
3
4
5
6
cmake -G "MinGW Makefiles" `
-D CMAKE_BUILD_TYPE=Release `
-D WITH_FFMPEG=ON `
-D OPENCV_FFMPEG_INCLUDE_DIR="C:\Users\HowXu\source\ffmpeg\include" `
-D OPENCV_FFMPEG_LIBRARY="C:\Users\HowXu\source\ffmpeg\lib" `
..

设置构建类型为Release,开启带入FFmpeg构建,指定FFmpeg的头文件和Lib目录,最后..指定是上层文件夹的CmakeLists.txt文件,最后应该可以看到是这样的:

alt text

其中的FFmpeg选项是On.

然后你就可以make了,最好指定-j参数加快构建速度,比如我的就是make -j10.

结果是这样:

alt text

这样的过程还可以在Linux上干一遍,相当地简单,下载源码我就不说了,你只需要像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt install ffmpeg
sudo apt install -y build-essential cmake git libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev

# 在OpenCV源代码目录 建议新开一个终端
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release \
-D WITH_FFMPEG=ON \
-D WITH_V4L=ON \
..

# Cmake文件生成完成之后
make -j16

然后等待构建完成就可以了.

关于VSCode的C语言插件问题

这其实是一个老问题了,我就直说了,微软官方给的C/C++插件就是一坨.当然呢我们现在有更好的替代品clangd.

clangd在语法提示和智能补全这方面做的相当好,因为我之前用惯了C/C++插件的调试功能,(如果你也习惯了的话)所以我这里只更换智能提示插件为clangd.

对于Windows:

首先要下载clangd,因为它只是llvm的一部分,你可以不需要下载整套llvm.Github

找个地方解压就行了,不需要配置环境变量.

然后打开VSCode,找到这个插件:

alt text

安装后重启VSCode,在设置里找到clangd的插件设置:

alt text

然后找到下面两个选项:

alt text

第一个选项是全局的头文件搜索库,我用的是MinGW所以直接填两个目录就行了,注意格式是-Ixxxxxx,大写的I.第二个选项是clangd.exe的位置,也是照着填就行.

这里贴一下MingW在Windows平台上的头文件示例:

1
2
3
4
5
6
7
"clangd.fallbackFlags": [
"-IC:\\SDK\\x86_64-14.2.0-release-win32-seh-ucrt-rt_v12-rev0\\mingw64\\include",
"-IC:\\SDK\\x86_64-14.2.0-release-win32-seh-ucrt-rt_v12-rev0\\mingw64\\x86_64-w64-mingw32\\include",
"-IC:\\SDK\\x86_64-14.2.0-release-win32-seh-ucrt-rt_v12-rev0\\mingw64\\lib\\gcc\\x86_64-w64-mingw32\\14.2.0\\include",
"-IC:\\SDK\\x86_64-14.2.0-release-win32-seh-ucrt-rt_v12-rev0\\mingw64\\lib\\gcc\\x86_64-w64-mingw32\\14.2.0\\include\\c++",
"-IC:\\SDK\\x86_64-14.2.0-release-win32-seh-ucrt-rt_v12-rev0\\mingw64\\lib\\gcc\\x86_64-w64-mingw32\\14.2.0\\include\\c++\\x86_64-w64-mingw32"
]

最后,关掉C/C++插件的智能提示就可以了:

alt text

那Linux下的操作就简单多了:

1
sudo apt install clangd

然后安装插件,关掉C/C++的智能提示,就完事了.是的,尊贵的Linux用户不需要手动配置clangd.

再说一下clangd的一些小问题. clangd在开项目文件夹的时候默认不是MingW方向的,以至于甚至会对MingW的stdio.h报错, 解决办法是在项目根目录下添加.clangd文件,然后把平台设置为MingW:

1
2
3
4
5
6
7
8
9
10
11
12
CompileFlags:
Add:
- -std=c++20
- -target
- x86_64-w64-mingw32
- -I<C:\Users\HowXu\Documents\source\opencv-4.10.0\build\install\include>
# 这是一个opencv的头文件相关

Diagnostics:
Suppress:
- unresolved-includes
# 阻止导入未使用的头文件报错

这只对当前项目有效, 而且这些flag不能放到VSCode的配置里面, 全局生效需要在C:\Users\用户名\AppData\Local\clangd文件夹下新建config.yaml文件, 然后上面的内容. 需要注意, -std=c++20是不能给C文件用的.

然后再说一个简单的配置问题,完全的配置你可以在知乎,我只配置了两个比较顺手的东西:

alt text

1
2
3
4
5
"clangd.arguments": [
"--completion-style=detailed",
"--header-insertion=iwyu",
"--function-arg-placeholders=false"
]

第一个是完全补全(其实是默认的),第二个是自动补全头文件,第三个是函数不会完全补全参数(这个功能其实也还行,你可以用Tab键跳到下一个参数).

然后说一下用了clangd之后的代码格式化问题,clangd内置的代码格式化是LLVM风格(挺丑的),我个人比较喜欢Microsoft风格,原来的C/C++插件有这个格式化功能,但是disable Intelligence之后是不可用的.

所以借助一下Clang Format这个插件:

alt text

这个插件是要使用clang-format这个程序的,理论上需要我们下载达1G的LLVM才能有,但是我们可以用C/C++插件内置的.

一般位于C:\Users\用户名\.vscode\extensions\ms-vscode.cpptools-1.22.11-win32-x64\LLVM\bin这个目录下.

alt text

填上去,改一下代码风格,然后随便右键一个c文件,选择使用..格式化文档就可以了.

在Linux上可以直接sudo apt install clang-format

还有一个关于Rider配置SDK的碎碎念

如果不小心把Rider的SDK弄到了别处并且是保存到此电脑,可以在~/.config/jetbrains/Riderxxx/resharper-host/GlobalSettingsStorage.DotSettings这个文件找到配置行.


小记最近干了些什么的碎碎念
https://blog.howxu.com/2024/11/12/小记最近干了些什么的碎碎念/
作者
HowXu
发布于
2024年11月12日
许可协议