无法解析的外部符号
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 上,运行此命令会执行以下操作:
-S
: 从软件包仓库中安装或更新给定的软件包。
-yy
: 要求 pacman 强制更新本地的软件包数据库。即使本地已经具有最新的软件包列表,也可以使用这个选项来手动更新该列表。
-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。
问题出在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是可以找到的
而msys2显然没有
- 解决办法:
增加系统环境变量:
MSYS2_PATH_TYPE=inherit
重启cmd,让环境变量生效,注意:不是在cmd中重新执行msys2_shell.cmd
,这样是没用的
重新进行configuration,就能看到已经正确识别到C Compiler
了
warning C4828: 文件包含在偏移 0x249 处开始的字符,该字符在当前源字符集中无效(代码页 65001)
编译过程中大量的警告,原因是生成的代码config.h中包含中文导致的:
解决办法,删除这段中文字符串,重新进行编译
仍旧是gcc编译器
如果mingw32能够找到cl,但是configure的结果用的compiler还是gcc,就是你的启动方式有问题,直接启动mingw32也会出现这个问题
从这个cmd窗口启动的msys2_shell.cmd
才有效
最终成功编译出32为dll
再执行make install
就会将导出的文件统一放在configure的prefix目录下,方便我们提供给其他使用,里面包含了头文件、dll、lib。
查看电脑的CPU核心数量
编译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上都能正常运行,完美解决