首页 > 解决方案 > 如何使用 MSYS2 环境为 Windows 静态编译 ffmpeg?

问题描述

我想使用 MSYS2 环境工具从官方 git 源代码为 Windows 构建独立的静态链接 ffmpeg 二进制文件。但是每次我得到动态链接到 mingw 库的 .exe 文件时,即使我输入了所需的 libbz2-1.dll、libiconv-2.dll 和 libwinpthread-1,也会出现“应用程序无法正确启动(0xc000007b)”错误。 dll 库在它的文件夹中。

我正在运行 MSYS2 环境

msys2_shell.cmd -mingw64

行,并使用 mingw64/mingw-w64-x86_64-gcc 8.2.1+20181214-1 编译器包。然后我运行 ./configure

./configure --pkg-config-flags=--static --disable-shared --enable-static

line - 我尽我所能搜索的最佳选择。然后进行一般

make
make install

序列。

结果,我得到了在 MSYS2 环境本身中运行顺畅的二进制文件,但是当我从主机 Windows 资源管理器或 cmd 运行它时,首先它要求 libbz2-1.dll、libiconv-2.dll 和 libwinpthread-1.dll库,当我将它们放在二进制文件的文件夹中时,它们会因“应用程序无法正确启动(0xc000007b)”错误而崩溃。

我已经在官方https://ffmpeg.zeranoe.com/forum/viewtopic.php?f=5&t=6439论坛上询问过这个案例,但已经 5 天没有回复。

关于动态链接库,我以某种方式获得了从 mingw64\x86_64-w64-mingw32\lib 文件夹中删除 *.dll.a 文件的创可贴解决方案。但对我来说它看起来不是很干净。我想知道是否可以使用一些编译器/make/linker 参数或以某种方式编辑 ./configure 或 Makefile 文件进行静态链接?

0xc000007b 错误仍然存​​在。

我已经设法使用基于相同 MSYS2 环境的 media-autobuild_suite 获得了预期的结果,所以我知道有可能以某种方式做到这一点。但是我对所有这些 *nix 东西都很陌生,所以根本不明白它是 bash 脚本,更不用说它本身就相当复杂了。我看到的唯一一件事是生成在本机 Windows 环境下运行的正确 ffmpeg 可执行文件,不需要上面列出的 dll。

根据我目前在互联网上找到的所有指南,我应该使用这个工具集获得独立的 Windows 可执行文件,但它只是不起作用而且我被卡住了。请帮忙。

标签: ffmpegmingwstatic-linkingmingw-w64msys2

解决方案


我有同样的问题。为了解决这个问题,我尝试禁用所有外部库。

我的配置:

--enable-static --enable-gpl --disable-w32threads --disable-autodetect

编译后,我将libwinpthread-1.dll/mingw64/bin复制到二进制文件的文件夹中。(您可以使用ldd ffmpeg.exe打印共享库依赖项)

ffmpeg.exe 和 ffprobe.exe 可以成功运行。

使用 ffmpeg-4.4 & msys2-x86_64-20210419


推荐阅读