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安装即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TikTok美国战略升级:聚焦美食旅行,本地化服务如何重塑市场格局

平台深耕本土内容生态,餐饮旅游创作者迎流量红利,算法推荐机制激发地域经济新活力 过去一年,TikTok在美国市场的动作频频引发行业关注。从早期以娱乐、舞蹈为主的全球化内容,到如今将资源向美食、旅行两大垂类倾斜,这…

Unity Dots环境配置

文章目录 前言环境配置1.新建Unity 工程2.安装Entities包2.安装EntitiesGraphics包3.安装URP渲染管线 Dots窗口 前言 DOTS(Data-Oriented Technology Stack)是Unity推出的一种用于开发高性能游戏和应用的数据导向技术栈,包含三大核心组件&am…

manus对比ChatGPT-Deep reaserch进行研究类学术相关数据分析!谁更胜一筹?

没有账号,只能挑选一个案例 一夜之间被这个用全英文介绍全华班出品的新爆款国产AI产品的小胖刷频。白天还没有切换语言的选项,晚上就加上了。简单看了看团队够成,使用很长实践的Monica创始人也在其中。逐渐可以理解,重心放在海外产…

Python项目-基于Django的在线教育平台开发

1. 项目概述 在线教育平台已成为现代教育的重要组成部分,特别是在后疫情时代,远程学习的需求显著增加。本文将详细介绍如何使用Python的Django框架开发一个功能完善的在线教育平台,包括系统设计、核心功能实现以及部署上线等关键环节。 本项…

【自学笔记】Numpy基础知识点总览-持续更新

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Numpy基础知识点总览目录1. 简介Numpy是什么为什么使用Numpy 2. 数组对象(ndarray)创建数组数组的属性数组的形状操作 3. 数组的基本操作数组…

Kubernetes中的 iptables 规则介绍

#作者:邓伟 文章目录 一、Kubernetes 网络模型概述二、iptables 基础知识三、Kubernetes 中的 iptables 应用四、查看和调试 iptables 规则五、总结 在 Kubernetes 集群中,iptables 是一个核心组件, 用于实现服务发现和网络策略。iptables 通…

.NET Core全屏截图,C#全屏截图

.NET Core全屏截图,C#全屏截图 使用框架: WPF.NET 8 using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; using System.W…

Java直通车系列15【Spring MVC】(ModelAndView 使用)

目录 1. ModelAndView 概述 2. ModelAndView 的主要属性和方法 主要属性 主要方法 3. 场景示例 示例 1:简单的 ModelAndView 使用 示例 2:使用 ModelAndView 处理列表数据 示例 3:使用 ModelAndView 处理异常情况 1. ModelAndView 概…

视频图像刷新到HTTP的原理

上一篇博客已经说了cgi拿到了共享内存的程序还需要处理的才能够真正刷新到网页里面去 HTTP协议介绍 HTTP中文名称是超文本传输协议,它是一个简单的请求.响应协议,HTTP协议它运行在TCP上面,它是互联网数据通信的基础。 几乎所有的网页请求和互…

2024四川大学计算机考研复试上机真题

2024四川大学计算机考研复试上机真题 2024四川大学计算机考研复试机试真题 历年四川大学计算机考研复试机试真题 在线评测:https://app2098.acapp.acwing.com.cn/ 分数求和 题目描述 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前 …

Python评估网络脆弱性

一、网络安全 (1)网络安全的定义 网络安全是指计算机网络系统中的硬件、数据、程序等不会因为无意或恶意的原因而遭到破坏、篡改、泄露,防止非授权的使用或访问,系统能够保持服务的连续性,以及能够可靠的运行。网络安…

Java后端高频面经——Spring、SpringBoot、MyBatis

Spring定义一个Bean有哪些方法?依赖注入有哪些方法? (1)定义Bean的方法 注解定义Bean,Component 用于标记一个类作为Spring的bean。当一个类被Component注解标记时,Spring会将其实例化为一个bean&#xff0…

Qt 实现绘图板(支持橡皮擦与 Ctrl+Z 撤销功能)[特殊字符]

作业&#xff1a; 1&#xff1a;实现绘图的时候&#xff0c;颜色的随时调整 2&#xff1a;追加橡皮擦功能 3&#xff1a;配合键盘事件&#xff0c;实现功能 当键盘按 ctrlz的时候&#xff0c;撤销最后一次绘图 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidge…

计算机网络(1) 网络通信基础,协议介绍,通信框架

网络结构模式 C/S-----客户端和服务器 B/S -----浏览器服务器 MAC地址 每一个网卡都拥有独一无二的48位串行号&#xff0c;也即MAC地址&#xff0c;也叫做物理地址、硬件地址或者是局域网地址 MAC地址表示为12个16进制数 如00-16-EA-AE-3C-40 &#xff08;每一个数可以用四个…

HOW - React 如何在在浏览器绘制之前同步执行 - useLayoutEffect

目录 useEffect vs useLayoutEffectuseEffectuseLayoutEffect主要区别总结选择建议注意事项 useLayoutEffect 使用示例测量 DOM 元素的尺寸和位置示例&#xff1a;自适应弹出框定位 同步更新样式以避免闪烁示例&#xff1a;根据内容动态调整容器高度 图像或 Canvas 绘制前的准备…

【无人机三维路径规划】基于CPO冠豪猪优化算法的无人机三维路径规划Maltab

代码获取基于CPO冠豪猪优化算法的无人机三维路径规划Maltab 基于CPO冠豪猪优化算法的无人机三维路径规划 一、CPO算法的基本原理与核心优势 冠豪猪优化算法&#xff08;Crested Porcupine Optimizer, CPO&#xff09;是一种新型元启发式算法&#xff0c;其灵感来源于冠豪猪的…

深度学习驱动的智能化革命:从技术突破到行业实践

第一章 深度学习的技术演进与核心架构 1.1 从浅层网络到深度学习的范式转变 深度学习的核心在于通过多层次非线性变换自动提取数据特征,其发展历程可划分为三个阶段:符号主义时代的规则驱动(1950s-1980s)、连接主义时代的浅层网络(1990s-2000s)以及深度学习时代的端到端…

简洁实用的3个免费wordpress主题

高端大气动态炫酷的免费企业官网wordpress主题 非常简洁的免费wordpress主题&#xff0c;安装简单、设置简单&#xff0c;几分钟就可以搭建好一个wordpress网站。 经典风格的免费wordpress主题 免费下载 https://www.fuyefa.com/wordpress

RabbitMQ 高级特性解析:RabbitMQ 消息可靠性保障 (上)

RabbitMQ 核心功能 RabbitMQ 高级特性解析&#xff1a;RabbitMQ 消息可靠性保障 &#xff08;上&#xff09;-CSDN博客 RabbitMQ 高级特性&#xff1a;从 TTL 到消息分发的全面解析 &#xff08;下&#xff09;-CSDN博客 前言 最近再看 RabbitMQ&#xff0c;看了看自己之前写…

用DeepSeek-R1-Distill-data-110k蒸馏中文数据集 微调Qwen2.5-7B-Instruct!

下载模型与数据 模型下载&#xff1a; huggingface&#xff1a; Qwen/Qwen2.5-7B-Instruct HF MirrorWe’re on a journey to advance and democratize artificial intelligence through open source and open science.https://hf-mirror.com/Qwen/Qwen2.5-7B-Instruct 魔搭&a…