尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MinGW-w64 构建 vlc-qt 全流程:从编译到打包分发实践

MinGW-w64 构建 vlc-qt 全流程:从编译到打包分发实践 简介vlc-qt_build_mingw64_install.zip 是在 Windows 64 位环境下使用 MinGW-w64 8.1.0 工具链构建的 Qt 与 VLC 集成编译包定位为带图形界面的播放器开发基础组件版本组合为 Qt5.15.2 与 VLC3.0.14。Qt5.15.2 提供稳定的 GUI 框架VLC3.0.14 支持常见音视频格式与网络流播放两者结合后开发者可直接在 Qt 应用中嵌入 VLC 播放能力省去自行编译 VLC-Qt 库时的环境配置与依赖匹配工作。压缩包共 399 个文件大小约 43.28MB主体为 338 个 dll 动态链接库和 38 个 h 头文件并包含 14 个 cmake 配置脚本、静态导入库等覆盖运行时依赖与开发引用适合用 CMake 或 Qt Creator 直接链接也能通过头文件查看模块接口。目前已有 435 人学习下载该资源不仅提供可用的二进制产物还保留了清晰的构建结构可辅助理清 VLCQtCore、VLCQtWidgets、VLCQtQml 等模块的依赖关系并为 MinGW64 平台的部署和二次开发提供参考。需要留意的是资源仅供学习交流作者要求下载后 24 小时内删除使用者请自行评估并遵守相关条款。1. 从压缩包到能跑的播放器vlc-qt_build_mingw64_install.zip 到底解决了什么拿到一个名为vlc-qt_build_mingw64_install.zip的压缩包第一反应往往是解压出来双击 demo 却闪退报错一堆找不到 DLL。这个压缩包要解决的问题其实非常明确——它是一份用 MinGW-w64 工具链在 Windows 上完成编译、并打包成绿色安装形态的 vlc-qt 库。vlc-qt 的价值是把 VLC 的播放能力封装成 Qt 控件让 Qt 桌面应用直接嵌入视频播放功能而不用自己去调底层 libvlc 的 C API。用 MinGW-w64 编译而不是 MSVC意味着你手上必须是同一套 ABI 的 Qt 套件否则链接阶段就翻车。这个 zip 适合两类人一类是 Qt 应用里需要播放本地视频、流媒体但不想折腾 VLC 环境依赖的开发者另一类是负责把构建产物分发给同事或生产环境的打包运维他们需要的是“解压即用”而不是“再装一遍依赖”。2. 构建前准备msys2 环境里的 MinGW-w64 工具链与依赖版本对齐2.1 为什么选 mingw64 而不是 MSVCQt 套件与 ABI 匹配vlc-qt 说到底是对 libvlc 的动态库做了 C 封装最终产物是一组 Qt 插件和动态链接库。Windows 上编译这类库最常见的两个选择是 MSVC 工具链和 MinGW-w64 工具链。选 MinGW-w64 的核心理由是 ABI 一致性——vlc-qt 依赖 Qt而 Qt 官方只提供 MSVC 版本但很多团队需要在 Qt Creator 里用 MinGW 套件开发或者需要产出一个不依赖 VC 运行时的绿色包。MinGW-w64 编译出来的动态库依赖 libgcc_s_seh-1.dll、libstdc-6.dll 这类运行时这些 DLL 可以随包一起分发不需要用户预先安装 VC 红istributable。另一个现实原因是调试和日志。MinGW-w64 编译的 vlc-qt 库跟 VLC 官方 Windows 版本一样走 GCC 的调试符号体系配合 Qt Creator 的调试器可以单步跟进 libvlc 调用栈而 MSVC 版本在混用调试器时常会遇到“符号不匹配”的黑匣子问题。加上 VLC 官方的 Windows SDK 本身也提供包括libvlc.dll.a在内的 GCC 导入库说明官方就是预期有 MinGW 用户存在的。2.2 用 pacman 一次性装齐工具链、Qt5、CMake 与解压工具在 msys2 环境里装齐工具链是最省事的一条路。打开 MSYS2 终端先用一条命令把基础包更新到当前版本再装编译 vlc-qt 需要的东西pacman -Syu \ mingw-w64-x86_64-toolchain \ mingw-w64-x86_64-cmake \ mingw-w64-x86_64-qt5-base \ mingw-w64-x86_64-qt5-tools \ mingw-w64-x86_64-qt5-winextras \ mingw-w64-x86_64-7zipmingw-w64-x86_64-toolchain是 GCC、binutils、make 的合集编译器和链接器都从它来。mingw-w64-x86_64-cmake不能省因为 MSYS2 自带的 cmake 是给 MSYS 环境用的生成不了 MinGW 的 Makefile。qt5-base和qt5-tools提供 QtWidgets、Qt5Core 以及 mkspecsvlc-qt 编译时必须能找到这些模块的 CMake 配置目录。7zip是后面打包 zip 用的MSYS2 里的 7z 直接支持a命令压缩 zip 格式。装完以后务必确认 PATH 顺序。进入 MSYS2 的 MinGW64 终端后执行which gcc如果返回的是/mingw64/bin/gcc就对了如果返回/usr/bin/gcc说明你在这个终端里用了 MSYS 的 GCC编出来的东西是跑在 MSYS 模拟层上的不能给 Windows 原生程序用。这个 PATH 问题是后续一系列编译事故的开端我一般会写进团队的构建检查清单里。2.3 下载 VLC SDK版本分支与目录约定vlc-qt 只是外壳真正干播放活的是 libvlc 和 libvlccore所以必须有一份 VLC 的 Windows SDK。常见做法是去 VLC 官方下载页拿 win64 的 SDK 压缩包里面包含include/、lib/、bin/、plugins/四部分。选版本时要注意VLC 3.0.x 和 VLC 4.0 的插件机制和导出符号有一定差异vlc-qt 的稳定分支通常针对 3.0 做适配4.0 分支的 API 还没有完全冻结我建议先用 3.0.x 的 SDK 跑通全流程。把 SDK 解压到一个干净目录例如C:/libs/vlc-sdk-3.0。解压后先检查lib/下有没有libvlc.dll.a和libvlccore.dll.a这两个文件很多所谓“SDK 包”只带了 DLL 和头文件没有导入库MinGW 链接时必须用libvlc.dll.a才能生成对 DLL 的导入表。如果发现缺失需要换一个发布版本而不是自己拿dlltool去生成——手工生成导入库容易漏符号编出来的 vlc-qt 运行时才暴雷这是能省则省的麻烦。3. 编译 vlc-qt 主库CMake 配置与 install 目标的关键参数3.1 先明确这三个路径Qt 的 CMake 目录、VLC SDK、安装前缀vlc-qt 用的是 CMake 构建系统源代码拿下来以后配置阶段决定成败的是CMAKE_PREFIX_PATH。这个变量会同时影响 CMake 对 Qt5 和 VLC 的查找所以要把工具链、Qt 和 VLC SDK 三者的关系一次讲清楚。常见做法是分别给出路径用分号隔开cmake -G MinGW Makefiles \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_PREFIX_PATHC:/msys64/mingw64;C:/libs/vlc-sdk-3.0 \ -DCMAKE_INSTALL_PREFIXC:/deploy/vlc-qt-3.0 \ -DBUILD_TESTINGOFF \ ../vlc-qt-G MinGW Makefiles指定生成 MinGW 用的 Makefile这样后面就能直接执行mingw32-make不需要 Visual Studio 的生成器。CMAKE_PREFIX_PATH里前一项是 MSYS2 的 mingw64 目录CMake 会顺着它找到lib/cmake/Qt5/Qt5Config.cmake后一项是 VLC SDK 目录里面需要有lib/cmake或标准include、lib结构。CMAKE_INSTALL_PREFIX是产物的落点也就是后面打包 zip 的源目录。BUILD_TESTING关掉是为了省掉测试目标快速得到主库。3.2 编译与安装mingw32-make 的输出解读配置成功后会生成 Makefile然后执行编译和安装两步mingw32-make -j8 mingw32-make install-j8是并行度机械硬盘上建议用-j4否则 GCC 编译多个大文件时 CPU 排队导致磁盘 IO 抖动反而更慢。如果内存紧张把并行数压到 2 也比较稳。编译结束以后make install会把头文件安装到C:/deploy/vlc-qt-3.0/include把库安装到lib/下还会生成一个install_manifest.txt里面逐行列出每个被安装的文件绝对路径。这个 manifest 是打包时的重要依据。我建议先cat install_manifest.txt看一眼确认安装到了预期前缀而不是默认的/usr/local。如果发现路径不对多半是 CMake 配置阶段CMAKE_INSTALL_PREFIX被覆盖了或者 CMakeCache 缓存了旧的路径——删掉 build 目录重新配置是最直接的后悔药。3.3 链接顺序和导入库MinGW 下最容易翻车的一步vlc-qt 编译完会得到libVLCQtCore.dll.a、libVLCQtWidgets.dll.a等导入库它们链接到 libvlc 时依赖libvlc.dll.a。MinGW 的 GNU ld 对静态库和导入库的链接顺序极其敏感-lVLCQtWidgets写在-lVLCQtCore前面可以但-lvlc如果写在依赖它的库前面就会报 undefined reference。举一个真实常见的错误把-lVLCQtCore -lvlc -lvlccore写成-lvlc -lVLCQtCore链接器按顺序扫描到VLCQtCore时发现引用libvlc_*符号回头找前面的libvlc导入库已经扫过了于是报一堆undefined reference to libvlc_new。这不是代码问题是链接顺序问题。解决办法是让被依赖的库靠后。很多构建脚本会把这行写成mingw32-make VERBOSE1 21 | grep libvlc看到实际的链接命令里-lvlc出现的位置再调整 CMake 里的target_link_libraries顺序。这个命令只用于观察结果不修改代码建议编不过的时候先看 Console 输出别急着改源码。4. 打包 zip install把运行依赖铺满再出可分发的压缩包4.1 用 windeployqt 补齐 Qt 运行库编译产物不能直接塞进 zip因为 vlc-qt 的 DLL 依赖 Qt5Core、Qt5Gui、Qt5Widgets 等运行库这些在开发机上有 MSYS2 环境撑着换一台干净的 Windows 机器就全缺了。常见做法是用 Qt 自带的 windeployqt 工具把依赖 DLL 收集到同一目录。在 MinGW64 终端里执行export PATH/mingw64/bin:$PATH windeployqt --release --no-translations --no-system-d3d-compiler \ --dir C:/deploy/vlc-qt-3.0/runtime \ C:/deploy/vlc-qt-3.0/bin/VLCQtWidgets.dll关键参数是--dir指定输出目录--no-translations跳过语言包体积能小一点--no-system-d3d-compiler不把系统的 d3d 编译器打进包这个 DLL 在 Win7 跟 Win10 上表现不一致省略掉更省事。运行完以后检查runtime/下是否出现了Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll。另外还要留意有没有libstdc-6.dll和libgcc_s_seh-1.dll这两个是 MinGW 运行时windeployqt 不负责收集需要手动从/mingw64/bin/拷过来。漏掉libstdc-6.dll的症状非常典型解压 zip 后双击程序秒退事件查看器里报找不到模块。4.2 把 VLC 的 plugins 目录和 libvlc 运行时一起拷齐vlc-qt 本身只是壳播放要靠 VLC 的运行时目录结构。VLC 对目录布局有硬性要求libvlc.dll、libvlccore.dll和plugins/目录必须在同一层级否则 libvlc 初始化时找不到插件虽然能构造出播放器实例但open()媒体后不渲染画面。从 VLC SDK 里把这些内容复制到部署目录cp -r C:/libs/vlc-sdk-3.0/bin/*.dll C:/deploy/vlc-qt-3.0/bin/ cp -r C:/libs/vlc-sdk-3.0/plugins C:/deploy/vlc-qt-3.0/ cp -r C:/libs/vlc-sdk-3.0/lib C:/deploy/vlc-qt-3.0/liblibvlc.dll放在bin/下没问题但plugins/必须与它平级放在C:/deploy/vlc-qt-3.0/plugins不能放bin/plugins。如果程序启动后日志里出现 “VLC plugins not found” 或黑屏九成是这个层级关系错了。VLC 查找插件时会先读libvlccore.dll的同级目录找plugins找不到再检查环境变量VLC_PLUGIN_PATH。为了双保险可以在部署包的根目录放一个启动脚本显式指定插件路径这个脚本在第 5 章避坑里会细讲。4.3 写 install.cmd 做就地启用再用 7z 出包对“install.zip”这个形态来说最实用的安装脚本不是写注册表而是提供一个拉齐运行路径的启动器。因为 zip 包被用户解压到哪个目录不确定脚本里尽量避免绝对路径用%~dp0取自身所在目录echo off set ROOT%~dp0 set PATH%ROOT%bin;%ROOT%runtime;%PATH% set VLC_PLUGIN_PATH%ROOT%plugins start %ROOT%bin\MyPlayer.exe %*设置VLC_PLUGIN_PATH是关键它告诉 libvlccore 去哪里找插件PATH前面加上runtime是为了让 Qt 运行库优先从包里加载防止系统里装了别的 Qt 版本导致混用。这个脚本本身就是“install”动作用户解压 zip 后再双击它就能启动程序。最后一步是把整个部署目录打包cd C:/deploy 7z a -mx5 -tzip vlc-qt_build_mingw64_install.zip ./vlc-qt-3.0/-mx5是压缩级别中档DLL 和插件大多已压缩过再高的级别收益很低而且耗时-tzip强制输出 zip 格式而不是 7z 格式因为目标机器上不一定装有 7-Zipzip 用 Windows 自带解压就能打开。如果后续迭代只改了少量 DLL可以用 7z 的增量更新模式7z a -tzip -u vlc-qt_build_mingw64_install.zip ./vlc-qt-3.0/-u参数只更新有变化的文件几十兆的包重新出包几秒就能完成不用全量重压。5. vlc-qt 构建避坑MinGW-w64 环境下最高频的 5 个踩坑记录5.1 双击 demo 秒退事件日志找不到模块现象打包好的 zip 解压到同事机器上双击 exe 没反应或闪退Windows 事件查看器里记录 “模块可能已损坏” 或直接找不到指定模块。原因最常见是 MinGW 运行时 DLL 缺失。windeployqt 并不收集libstdc-6.dll、libgcc_s_seh-1.dll和libwinpthread-1.dll而 vlc-qt 的 DLL 和你的 exe 都是 GCC 编出来的启动时必须要这三个库。解决从C:/msys64/mingw64/bin/下把这几个 DLL 复制到包的runtime/目录再重新出 zip。检查的时候用依赖查看工具扫一下主程序比手动猜靠谱得多。5.2 链接报 undefined reference 到 libvlc_ 接口现象编译 vlc-qt 或自己的播放器工程时出现大量undefined reference to libvlc_new、libvlc_media_player_new但确认已经写了-lvlc。原因两种情况。第一种是-lvlc在-lVLCQtCore之前链接顺序错第二种是 VLC SDK 里只有libvlc.lib这种 MSVC 导入库MinGW 的 ld 识别不了自然找不到导出符号。解决先把 SDK 换成带libvlc.dll.a的 MinGW 版本再调整链接顺序让-lvlc -lvlccore放在所有依赖它们的库后面。可以用第 3 章里的VERBOSE1观察真实链接命令确认。5.3 画面黑屏日志提示 VLC 找不到插件现象程序能启动实例能创建媒体状态也显示播放中但视频区域一片黑控制台或日志里出现VLC is not able to open the voter或plugin vlc access_output ...这类信息。原因plugins/目录与libvlc.dll不在同一层级或者VLC_PLUGIN_PATH没设置。libvlc 启动时会遍历插件目录找不到适合的 demux、access 插件就静默失败表现为黑屏而不是报错。解决在启动脚本里显式设置VLC_PLUGIN_PATH为解压根目录下的plugins文件夹并检查目录结构确保libvlc.dll和plugins/是兄弟关系。注意 zip 解压后不要中间多套一层目录否则相对路径全乱。5.4 Qt 运行库版本混搭导致随机崩溃现象程序在开发机上跑得好好的拷到另一台机器上偶发崩溃崩溃位置每次不同有时在 Qt 的事件循环里有时在绘制代码里。原因目标机器 PATH 里存在另一个版本的 Qt5Core.dll或部署包里的 Qt DLL 来源不统一。vlc-qt 是用 MSYS2 的 Qt 5.15 编的如果 windeployqt 用了另一个 Qt 安装目录比如单独下载的 mingw73 版两套 DLL 混在一起inline 函数和元对象系统对不上就随机炸。解决打包前先跑qmake -v确认 windeployqt 和 vlc-qt 用的是同一个 Qt 前缀。部署包里的 Qt DLL 全部由同一次 windeployqt 生成不要手工从其他地方补。5.5 杀毒软件把 zip 内 DLL 抽走解压后文件缺角现象用户报告 zip 解压后程序不能启动重新下载也一样最后发现是安防软件把包内某个 DLL 隔离了。原因MinGW 编译的 DLL 没有数字签名新编译出来的 PE 文件特征与多年前的恶意样本相似行为检测会直接误判。这不是 vlc-qt 本身的问题而是分发 MinGW 二进制的共性麻烦。解决如果包只在内网分发给同事可以把目录加进杀毒软件白名单如果要对外分发给客户建议对bin/下的 DLL 和企业自己的 exe 做代码签名个人开发者可以先申请免费的代码签名证书能明显降低误杀率。签名后记得再压一次 zip确保签名信息保留在包内文件上。6. 验证与收尾用最小播放器工程确认 zip 里的库真的能用6.1 用 objdump 检查 DLL 依赖避免发布前才炸出包前花两分钟扫一下依赖能省掉反复传包的尴尬。MinGW 里对应的命令是 objdumpobjdump -p bin/VLCQtWidgets.dll | grep DLL Name输出里会列出这个 DLL 依赖的所有动态库。对照部署包runtime/和bin/里的文件逐项确认每个依赖都存在。这一步能在本地复制出“缺 DLL”的现场比到目标机器上抓事件日志快得多。6.2 用 qmake 写最小播放器工程验证 include 与 lib 路径最终验证 zip 是否合格是建一个只依赖 zip 内容的 Qt 工程。工程文件指向解压后的目录而不是开发机的 MSYS2 目录这样能测试出包是否自包含// main.cpp #include QApplication #include VLCQtCore/Instance.h #include VLCQtCore/Media.h #include VLCQtCore/MediaPlayer.h #include VLCQtWidgets/WidgetVideo.h int main(int argc, char *argv[]) { QApplication app(argc, argv); VlcInstance *instance new VlcInstance(VlcCommon::args(), true); VlcMediaPlayer *player new VlcMediaPlayer(instance); VlcWidgetVideo *video new VlcWidgetVideo; video-setMediaPlayer(player); video-resize(640, 360); video-show(); VlcMedia *media new VlcMedia(C:/work/test.mp4, true, instance); player-open(media); return app.exec(); }工程文件里最需要注意的是链接顺序VLCQtWidgets依赖VLCQtCore所以写在前面QT widgets CONFIG c11 INCLUDEPATH C:/deploy/vlc-qt-3.0/include LIBS -LC:/deploy/vlc-qt-3.0/lib \ -lVLCQtWidgets -lVLCQtCore SOURCES main.cpp编译运行后能看到视频窗口播放本地文件说明 include、lib、plugins、DLL 四部分的路径全部对上。跑不通就按第 5 章的顺序一项项查先依赖、再插件、后链接顺序。6.3 后续迭代的增量出包习惯维护这个构建方案一段时间后我养成了一个习惯每次更新只重新执行mingw32-make install到同一个C:/deploy/vlc-qt-3.0目录然后用 7z 的-u增量更新 zip。这样既保证安装目录始终是编译产物的真实快照又不会把开发机上的临时文件混进来。每次发布前把install_manifest.txt一起放进包内留档排查问题的时候能第一时间知道文件来自哪次编译。这个习惯帮我避免过好几次“明明改了代码现场却还是旧版本”的疑惑也推荐你保留这套流程。希望帮到你。本文还有配套的精品资源点击获取
返回列表