Windows编译环境搭建(MSYS2\MinGW\cmake)
我的音视频/流媒体开源项目(github)
一、基础环境搭建
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
上面编译出来的ffmpeg不包含ffplay,因为ffplay依赖sdl,所以需要安装sdl才可以,同样使用pacman安装即可。
相关文章:

Windows编译环境搭建(MSYS2\MinGW\cmake)
我的音视频/流媒体开源项目(github) 一、基础环境搭建 1.1 MSYS2\MinGW 参考:1. 基于MSYS2的Mingw-w64 GCC搭建Windows下C开发环境_msys2使用mingw64编译 在Widndows系统上,使用gcc工具链(g)进行C程序开发?可以的&a…...

云曦春季开学考复现(2025)
Crypto 划水的dp和dq 下载附件后是简单的RSA算法题,之所以说简单是因为给了公钥e 趁热打铁,昨天刚学的RSA,既然有p有q,也有e,而np*q,可以算出欧拉函数值phi(p-1)*(q-1&…...
股票交易所官方api接口有哪些?获取和使用需要满足什么条件
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...
《WebForms 实例》
《WebForms 实例》 引言 WebForms 是微软推出的一种用于构建动态Web应用程序的技术。它基于ASP.NET框架,允许开发者使用服务器端控件来构建用户界面,并通过事件驱动模型来响应用户交互。本文将通过一些实例,详细介绍WebForms的使用方法&…...
【每日学点HarmonyOS Next知识】 状态变量、公共Page、可见区域变化回调、接收参数、拖拽排序控件
1、HarmonyOS 在定时器里面改变state修饰的变量,无法更新UI吗? 将函数function写成了封装函数的形式就可以了 Entry Component struct Index {State acSetValve: number 0;aboutToAppear(): void {setInterval(() > {this.acSetValve 200;console…...

Intent3D
1. 研究背景 在现实世界中,人们寻找 3D 物体的行为往往基于特定意图,例如“我想要一个可以支撑我背部的东西”(即寻找枕头)。传统 3D 视觉定位(3D-VG)主要依赖人工提供的参照信息(如“沙发上的…...

【Python 数据结构 10.二叉树】
目录 一、二叉树的基本概念 1.二叉树的定义 2.二叉树的特点 3.特殊的二叉树 Ⅰ、斜树 Ⅱ、满二叉树 Ⅲ、完全二叉树 Ⅳ、完全二叉树和满二叉树的区别 4.二叉树的性质 5.二叉树的顺序存储 Ⅰ、完全二叉树 Ⅱ、非完全二叉树 Ⅲ、稀疏二叉树 6.二叉树的链式存储 7.二叉树的遍历概念…...

从0开始的操作系统手搓教程27:下一步,实现我们的用户进程
目录 第一步:添加用户进程虚拟空间 准备冲向我们的特权级3(用户特权级) 讨论下我们创建用户线程的基本步骤 更加详细的分析代码 用户进程的视图 说一说BSS段 继续看process.c中的函数 添加用户线程激活 现在,我们做好了TSS…...

set、LinkedHashSet和TreeSet的区别、Map接口常见方法、Collections 工具类使用
DAY7.2 Java核心基础 想学习Collection、list、ArrayList、Set、HashSet部分的小伙伴可以转到 7.1集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判断两个对象是否相等文章查看 set集合 在set集合中,处理LinkedHashSet是有序的…...

Qt开发:nativeEvent事件的使用
文章目录 一、概述二、nativeEvent 的定义三、Windows 平台示例三、使用nativeEvent监测设备变化 一、概述 Qt 的 nativeEvent 是一个特殊的事件处理机制,允许开发者处理操作系统级别的原生事件。通常,Qt 通过 QEvent 机制来管理事件,但有时…...

鸿蒙Next-应用检测、安装以及企业内部商店的实现
一、企业内部应用检测和更新升级 A应用检测是否安装B应用 canOpenApp():boolean{ try { let link schB://com.example.test/open; // 替换成你目标应用的link串儿 let canOpen bundleManager.canOpenLink(link); console.log("canOpen:"canOpen…...
存量思维和增量思维
在网上看一篇文章,有两种典型的阅读方式。 一种,是挑刺式,眼里只有缺点。 比如,有人不厌其烦地告诉作者,哪段有错别字,哪段不够严谨。 闲得蛋疼。 有这工夫,多看会书,不香么&…...
golang将大接口传递给小接口以及场景
文章目录 golang将大接口传递给小接口背景什么是大接口传递给小接口使用场景 golang将大接口传递给小接口 背景 在 Go 语言中,接口是一种强大的工具,它允许我们定义对象的行为而不关心其具体实现。特别是在复杂的应用程序中,将一个实现了较…...
K8s 1.27.1 实战系列(七)Deployment
一、Deployment介绍 Deployment负责创建和更新应用程序的实例,使Pod拥有多副本,自愈,扩缩容等能力。创建Deployment后,Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会将该实例替换为群集中另一个节点上的…...

Swift系列02-Swift 数据类型系统与内存模型
Swift 是一门现代的、安全的编程语言,其类型系统和内存模型设计对性能和安全性有着重要影响。本文将深入探讨 Swift 的数据类型系统与内存模型,帮助你更好地理解并利用这些特性来优化你的 iOS 应用。本文主要包含: 值类型和引用类型…...

MySQL中like模糊查询如何优化?
大家好,我是锋哥。今天分享关于【MySQL中like模糊查询如何优化?】面试题。希望对大家有帮助; MySQL中like模糊查询如何优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中,LIKE 模糊查询虽然非常常见,…...

用低代码平台集成人工智能:无需专业开发也能实现智能化
引言:人工智能的普及与企业需求 随着人工智能(AI)技术的飞速发展,越来越多的企业开始意识到其在提升运营效率、优化客户体验和推动业务创新方面的巨大潜力。从智能客服到自动化决策支持,从数据分析到个性化推荐&#x…...

【使用hexo模板创建个人博客网站】
使用hexo模板创建个人博客网站 环境准备node安装hexo安装ssh配置 使用hexo命令搭建个人博客网站hexo命令 部署到github创建仓库修改_config.yml文件 编写博客主题扩展 环境准备 node安装 进入node官网安装node.js 使用node -v检查是否安装成功 安装成功后应该出现如上界面 …...

最简单圆形进度条实现CSS+javascript,两端带圆弧
两端是弧形的圆形进度条。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title…...

vuejs 模板语法、条件渲染、v-for、事件处理、表单输入绑定
创建vue项目之后我们就可以开始写代码了,我们的代码一般都会写在src目录-components目录-HelloWord.vue文件内。 我们之前写的HTML文件的结构是HTML代码可以集成或者连接外部的css/js文件。 我们通过vue建立的项目,它的结构是在一个vue文件内集成了HTML…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...