一、基础环境搭建
1.1 MSYS2\MinGW
参考:1. 基于MSYS2的Mingw-w64 GCC搭建Windows下C++开发环境_msys2使用mingw64编译
在Widndows系统上,使用gcc工具链(g++)进行C++程序开发?可以的!本文将就如何搭建这样一个环境,展开介绍。
- Windows下C/C++程序开发的差劲开发体验:
1、首先需要安装≈20 GB的Visual Studio(大型团队项目,还是需要VS的);
2、然后,很多第三方库,需要自己去GitHub或者相应的官网上下载源码,然后进行编译,而编译过程会遇到各种版本不兼容、缺少依赖、代码错误、需修改makefile文件等问题......至此库尚未编译成功,开发人员早已经被这差劲的体验劝退......
- MSYS2有三个优点:
1、仿Linux的终端交互环境,可以使用Linux下的终端命令和快捷方式;
2、自带pacman软件管理包,让您将精力放到C++代码的编写上,而不是复杂的依赖环境的搭建和编译。如:GDAL、OpenCV等第三方C/C++库,无须再去踩各种坑、艰难地编译而是直接一个命令就安装到了本地;
3、复用自己在Linux下的开发经验。使用g++进行库的链接、源码编译等操作,可更进一步了解C++代码的编译过程。
下载MSYS2
https://www.msys2.org/,进入MSYS2的官网,然后找到如下图下载链接,点击即可进行下载。

安装MSYS2
如下图,MSYS2的整个安装过程无须特别的设置,一路默认下一步即可,安装位置建议不要用C盘,因为后续使用pacman安装软件很占用空间,我是用了D盘。

配置pacman镜像源
- pacman是随MSYS2一起安装的软件包管理工具
- 安装完成MSYS2后,则可以在如下路径找到镜像配置文件:D:\msys64\etc\pacman.d,格式为mirrorlist.*,然后进行配置,配置前后的结果如下面两幅图所示。这里说的配置,其实就是将配置文件内的两个国内的镜像源"tsinghua(清华)"和"ustc(中科大)",移动(剪切粘贴)到主镜像(## Primary标识的msys2)的前面。


更新pacman基本软件仓库
配置完镜像源后,需要更新pacman的基本软件仓库,这分两个步骤:
第一步,执行如下命令,检查更新并下载,过程中,MSYS2可能会因为安装更新而自动关闭,此时,可再次在开始菜单中打开,然后再次执行"pacman -Syu"命令。
pacman -Syu

第二步,确定"pacman -Syu"命令的更新完毕,如下图,则说明更新完毕,然后执行如下命令,以更新因执行上已更新操作,而未更新的剩余程序。
pacman -Su

安装Mingw-w64 GCC编译工具链
Mingw-w64是Windows编译C/C++源代码的程序集,为了安装该软件,须执行如下命令,即可安装编译C/C++程序所需的编译工具如:gcc、g++、make等。此步骤安装的软件包较多,因此可能需要一定时间,取决于网络和电脑配置,约需3-5分钟。
pacman -S --needed base-devel mingw-w64-x86_64-toolchain


把D:\msys64\mingw64\bin(替换成实际路径)加入到环境变量中,就可以在任何位置使用gcc、g++、gdb以及mingw32-make等工具了,在cmd中和VSCode终端都可以,个人觉得使用msys2生成的MinGW64程序反而不方便。添加完环境变量之后在cmd下,输出gcc --version 和mingw32-make --version验证。如果不添加环境变量,就只能调用D:\msys64\mingw64.exe使用gcc/g++等工具,很不方便,我基本都是在VSCode中写代码并编译。

自此就可以使用VSCode,甚至记事本写C/C++程序,并使用gcc/g++编译了。注意编译出来的程序就是.exe结尾的(动态库是.dll和.dll.a结尾的,.lib是给MSVC编译器用的,也就是Visual Studio。MinGW使用的是.dll.a+.dll;MSVC是.lib+.dll,两者是不一样的),这里的MinGW只是模拟在Linux下的编译过程,但是生成程序或者动态库等还是Windows风格的。
注意:尽量不要再VSCode终端里面执行程序,因为CMD和VSCode的程序运行起来表现不一样,尤其是在多线程环境下,编译在CMD和VSCode终端下都是可以的。
当然,MinGW也可以不通过msys2安装,直接在电脑上安装MinGW也是可以的,但是因为在开发过程中,肯定还会用到其他的库和软件,如果每个都单独安装很麻烦,通过msys2就可以像Linux那样,直接在线使用命令安装,然后再加入Windows的环境变量中就可以了。此外如果涉及到要源码编译开源库,使用msys2也很方便,msys2简化了windows的软件安装和开源库源码编译过程,不用msys2也是可以的,只不过不方便。
二、cmake
再安装一个cmake,就可以实现大型项目的构建了,而且跨平台(cmake不用msys2安装,单独安装即可,同样要加入到环境变量,在任何位置都可以使用)。
参考:Windows下CMake的下载与安装详解_cmake下载-CSDN博客
CMake的下载与安装
CMake下载链接:https://cmake.org/download/。
下载最新稳定版即可(Latest Release):

下载完成后,单击"Next"按钮,在下图中勾选"I accept the terms in the License Agreement"复选框接受许可协议:

选中"Add CMake to the system PATH for all users"单选按钮添加系统路径变量。也可以同时勾选"CreateCMakeDesktopIcon"复选框,以便在安装完成后在桌面上创建CMake的快捷方式图标。

点击Install进行安装,在CMD下使用cmake --version进行验证。

自此就可以使用cmake和MinGW构建项目了,构建过程和Linux略有区别,不过cmake和gcc/g++语法都是一样的,步骤如下:
mkdir build
cd build
cmake -G "MinGW Makefiles" ..
mingw32-make
至此,就在Windows上搭建好了代码编译环境,我使用的是VSCode + MinGW + Cmake,如下图所示。

三、编译FFmpeg
在Windwos使用ffmpeg有两种方式:
1、在ffmpeg官网下载Windows上编译好的库,MinGW和MSCV都可以使用,因为.lib和.dll.a都有(为什么我不说.dll,因为无论是MinGW还是MSCV都需要.dll,.dll是exe程序运行必须有的,除非是静态链接。)
2、源码编译,因为ffmpeg官方编译好的库很多功能都没有用,比如,没有fdk-aac,如果要用fdk-aac就只能自己源码编译,此外有的软件,例如opencv只提供了.lib和.dll,没有.dll.a,要想在MinGW中使用,就必须源码编译(opencv编译坑很多,我是直接从网上下载编译好的,这一点和Linux不同,Linux上一台机器上编译出来的库很难在另外一台Linux上使用,除非环境及版本高度相似)。在msys2上和Linux上编译ffmpeg很相似。
依赖安装:
需求,在ffmpeg中添加libx264、libx265、libfdk-aac
首先用msys2搜索一下x264,使用命令:
pacman -Ss x264

我是mingw64,所以安装mingw-w64-x86_64-libx264,命令为:
pacman -S mingw-w64-x86_64-libx264

使用命令查看libx264的安装位置,命令为:
pacman -Ql mingw-w64-x86_64-libx264

在msys的安装路径下就可以找到这些库,知道库和头文件的位置,后面就可以用了。
用同样的方式安装libx265和fdk-aac,命令为:
pacman -S mingw-w64-x86_64-x265 #mingw-w64-x86_64-x265包含了x265可执行程序,之前安装的mingw-w64-x86_64-libx264不包含x264可执行程序,如果安装libx264的时候想包含x264.exe也可以安装mingw-w64-x86_64-x264,我们只用x264和x265的库,有没有exe都可以,我们不用
pacman -S mingw-w64-x86_64-fdk-aac
安装汇编库
pacman -S mingw-w64-x86_64-yasm mingw-w64-x86_64-nasm
ffmpeg源码下载:
下载地址:https://ffmpeg.org/releases/

我下载的是4.4.5
此时我们打开minw64,用来编译ffmpeg源码。

查看当前所在目录

当前所在目录为/home/sunkx1,在Windows上的实际路径就为D:\msys64\home\sunkx1,把下载的ffmpeg源码放到D:\msys64\home\sunkx1下面,ls看一下,就可以看到ffmpeg源码了。

解压:
tar -zxvf ffmpeg-4.4.5.tar.gz
进入到源码目录:
cd ffmpeg-4.4.5/
配置:
./configure --prefix=/home/sunkx1/ff-build --enable-libx264 --enable-libx265 --enable-gpl --disable-x86asm --enable-nonfree --enable-libfdk-aac --enable-shared --extra-cflags=-I/mingw64/include --extra-ldflags=-L/mingw64/lib
--prefix指定安装目录。
--enable-gpl:允许使用 GPL 许可证 的组件,比如 libx264 和 libx265,如果没有这个选项,FFmpeg 会拒绝编译 libx264。
--enable-nonfree:启用一些 非自由组件,不启用,libfdk-aac 就无法使用。
--disable-x86asm:禁用 x86 汇编优化(主要影响 H.264/HEVC 编码性能)。
--enable-shared:启用共享库(动态库 .dll 或 .so)。
--extra-cflags和--extra-ldflags指定libx264、libx265、libfdk-aac的安装路径。
编译安装:
make -j
make install
把如下路径添加到环境变量
D:\msys64\mingw64\bin
D:\msys64\home\sunkx1\ff-build\bin
第一个是x264、x265、fdk-aac的库所在位置(.dll)
第二个是ffmpeg库所在位置(.dll和exe)
配置好之后就可以在cmd中使用ffmpeg了,
在cmake中配置,就可以使用ffmpeg了
1、头文件位置
D:\msys64\mingw64\include
D:\msys64\home\sunkx1\ff-build\include
2、链接库位置
D:\msys64\mingw64\lib
D:\msys64\home\sunkx1\ff-build\lib