[✔️]FFMpeg编译32位踩坑指南

简介: [✔️]FFMpeg编译32位踩坑指南

无法解析的外部符号


error LNK2001: 无法解析的外部符号 "struct AVFormatContext * __cdecl avformat_alloc_context(void)" (?avformat_alloc_context@@YAPAUAVFormatContext@@XZ)


如果你的是c++项目,需要告诉编译器按照C的规则进行编译


extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
}


error LNK2001: 无法解析的外部符号 _avformat_alloc_context


注意lib的位数,大概率是你的应用程序位数和lib位数不一致,需要使用32的lib,dll


error: mingw32: signature from "David Macek david.macek.0@gmail.com" is unknown trust



pacman -Syyu


pacman -Syyu 是 Arch Linux 发行版中用于更新软件包的命令。


在 Arch Linux 上,运行此命令会执行以下操作:


  1. -S: 从软件包仓库中安装或更新给定的软件包。


  1. -yy: 要求 pacman 强制更新本地的软件包数据库。即使本地已经具有最新的软件包列表,也可以使用这个选项来手动更新该列表。


  1. -u: 如果发现新版本,会自动升级所有已安装的软件包。


因此,运行 pacman -Syyu 命令将会强制刷新本地软件包列表,并自动更新所有已安装的软件包到最新版本。


请注意,在执行此命令之前,请确保您已备份重要数据,并确保您已经充分了解所涉及的风险和可能的副作用。此外,如果您正在使用 Arch Linux 发行版,则必须以管理员权限运行此命令。


nasm/yasm not found or too old


nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.


yasm是汇编编译器,ffmpeg为了提高效率使用了汇编指令,如MMX和SSE等。


如果系统中未安装yasm时,就会报上面错误。


解决办法:


pacman -S yasm


FFMpeg编译配置


FFMpeg的编译,依赖其源码中的configure,支持传参进行编译配置,执行configure文件,并传递不同的参数,会生成不同的参数,然后执行make就可以完成编译了,所以参数的配置是非常重要的。


configure会打印详细的配置,这里我的ARCH是x86,我想编译32位的dll,但最终build出来的还是64位的dll。


image.png


问题出在c compiler是gcc,需要指定下编译器即可:


--toolchain=msvc
--enable-x86asm


关于如何打开msys2的心得


安装msys2后,可以在软件目录下找到:msys2_shell.cmd、mingw32.exe、mingw64

网上的大部分教程都说要使用vs tools的cmd工具执行上边的脚本,如果你要编译32位就使用


msys2_shell.cmd -mingw32


msys2_shell.cmd -mingw32


msys2_shell.cmd -mingw64


在我实际实践过程中发现其实没有必要,只要configure正常就问题不大。


linux gcc is unable to create an executable file. C compiler test failed.


注意检查config.log里面有更详细的错误日志


我发现是我的gcc参数不对


直接使用mysys2打开mingw32和通过vs tools cmd打开mingw32,环境变量差异在:


/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/Extensions/Microsoft/IntelliCode/CLI
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/HostX86/x64
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/HostX86/x86
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/VC/VCPackages
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/TestWindow
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/TeamFoundation/Team Explorer
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/bin/Roslyn
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Team Tools/Performance Tools/x64
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Team Tools/Performance Tools
/c/Program Files (x86)/Microsoft Visual Studio/Shared/Common/VSPerfCollectionTools/vs2019/x64
/c/Program Files (x86)/Microsoft Visual Studio/Shared/Common/VSPerfCollectionTools/vs2019
/c/Program Files (x86)/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.8 Tools
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/FSharp/Tools
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/Tools/devinit
/c/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86
/c/Program Files (x86)/Windows Kits/10/bin/x86
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/Bin
/c/Windows/Microsoft.NET/Framework/v4.0.30319
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/Tools
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/VC/Linux/bin/ConnectionManagerExe


cl.exe is unable to create an executable file.


在我本机cl是可以找到的


image.png


而msys2显然没有


image.png


  • 解决办法:


增加系统环境变量:


MSYS2_PATH_TYPE=inherit


image.png


重启cmd,让环境变量生效,注意:不是在cmd中重新执行msys2_shell.cmd,这样是没用的


image.png


重新进行configuration,就能看到已经正确识别到C Compiler


image.png


warning C4828: 文件包含在偏移 0x249 处开始的字符,该字符在当前源字符集中无效(代码页 65001)


编译过程中大量的警告,原因是生成的代码config.h中包含中文导致的:


image.png


解决办法,删除这段中文字符串,重新进行编译


仍旧是gcc编译器


如果mingw32能够找到cl,但是configure的结果用的compiler还是gcc,就是你的启动方式有问题,直接启动mingw32也会出现这个问题


image.png


从这个cmd窗口启动的msys2_shell.cmd才有效


最终成功编译出32为dll


image.png


再执行make install就会将导出的文件统一放在configure的prefix目录下,方便我们提供给其他使用,里面包含了头文件、dll、lib。


查看电脑的CPU核心数量


image.png


编译ffmpeg release/2.1 报错:c99wrap cl is unable to create an executable file.


2篇文章都有提到c99wrap,但是都没有效果,而且步骤还有问题




c99wrap 和 cl 都是 C 语言的编译器。c99wrap 是一个辅助编译器,可以将符合 C99 标准的代码转换为符合 C89 标准的代码。而 cl 则是 Microsoft Visual Studio 中的 C/C++ 编译器,它可以编译和链接 C 或 C++ 代码。


通常情况下,你可以使用 c99wrap 和 cl 来编译你的 C 代码,并生成可执行文件或动态库。使用 c99wrap 可以允许你在代码中使用 C99 增强的特性,例如 bool 类型、inline 函数、复合字面量等。同时,由于某些平台不支持 C99,使用 c99wrap 可以使你的代码更具可移植性。


捣鼓了很久,都没有成功,后来看到微软有ffmpeg的编译仓库,但是submodule更新不下来,最后选择的ffmpeg release/3.3,执行


BuildFFmpeg.bat win7


最后编译出来的x86在win7、win10上都能正常运行,完美解决

目录
相关文章
|
2月前
|
开发工具
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(三)
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(三)
51 0
|
2月前
|
Linux 编译器 数据安全/隐私保护
Windows10 使用MSYS2和VS2019编译FFmpeg源代码-测试通过
FFmpeg作为一个流媒体的整体解决方案,在很多项目中都使用了它,如果我们也需要使用FFmpeg进行开发,很多时候我们需要将源码编译成动态库或者静态库,然后将库放入到我们的项目中,这样我们就能在我们的项目中使用FFmpeg提供的接口进行开发。关于FFmpeg的介绍这里就不过多说明。
139 0
|
10月前
|
C++ Windows
FFmpeg入门及编译 3
FFmpeg入门及编译
75 0
|
10月前
|
编解码 API 开发工具
FFmpeg入门及编译 1
FFmpeg入门及编译
123 0
|
2月前
|
Linux
Linux编译FFmpeg
Linux编译FFmpeg
80 0
|
1月前
|
Ubuntu
蓝易云 - Ubuntu18.04安装编译ffmpeg库
现在,你应该已经在你的Ubuntu 18.04系统上成功安装和编译了FFmpeg库。你可以通过运行 `ffmpeg -version`来验证安装是否成功。
27 0
|
2月前
|
Ubuntu Linux Shell
Android-NDK-clang 编译 FFmpeg
Android-NDK-clang 编译 FFmpeg
57 0
|
2月前
|
移动开发 Unix Linux
ffmpeg编译so
ffmpeg编译so
28 0
|
2月前
|
编解码 IDE 开发工具
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(一)
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(一)
32 1
|
2月前
|
开发工具
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(二)
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(二)
36 0