新版ffmpeg编译时common.mak 138错误解决办法

本文解决了在使用MinGW编译FFmpeg时遇到的makefile问题。通过调整git配置并重新获取源代码,成功克服了编译障碍。

在编译最新版本ffmpeg时遇到上述问题。

通过网上搜索发现解决该问题的方法。

参考

http://comments.gmane.org/gmane.comp.video.ffmpeg.libav.user/10325


Re: makefile problem on win32 MinGW

Thomas Sharpless <tksharpless <at> ...> writes:

> ./configure: line 4652: git: command not found
> 
> The very last part of the configure script fails but 
> it looks to me like all it is trying to do is make 
> sure the source code is totally current.

It looks if the repository you are using is 
current, you don't have to worry about the warnings.

> But then, horrors!
> $ makecommon.mak:139: *** missing separator.  Stop.

This indicates that your checkout is broken, use:
$ git config --global core.autocrlf false
and checkout again.

Carl Eugen

解决方法

运行

git config --global core.autocrlf false
#然后运行下面的命令删除ffmpeg代码,并重新获取一下即可
git rm --cached -r .
git reset --hard


参考

https://help.github.com/articles/dealing-with-line-endings#platform-windows

<think> 我们正在处理交叉编译MPlayer时出现的两个错误: 1. `make[1]: *** [common.mak:60: libavcodec/aarch64/videodsp_init.o] Error 1` 2. `make: *** [Makefile:740:ffmpeg/libavcodec/libavcodec.a] 错误 2` 根据经验,这类错误通常与交叉编译工具链的配置、目标架构的指定、或源码中的汇编代码问题有关。特别是`videodsp_init.o`编译失败,这个文件是FFmpeg中与视频显示相关的汇编优化代码,而aarch64是ARM64架构。 解决步骤: 1. **确认交叉编译工具链配置正确**: 确保环境变量(如`CC`, `LD`, `AR`等)指向正确的交叉编译工具。例如,对于aarch64,可能是`aarch64-linux-gnu-gcc`等。 2. **检查配置选项**: 在配置MPlayer时,我们需要正确指定`--target`和`--host`选项。例如: ``` ./configure --target=aarch64-linux --host=aarch64-linux ``` 同时,确保`--enable-cross-compile`被设置(如果配置脚本支持的话)。 3. **FFmpeg汇编代码问题**: 由于错误发生在aarch64的汇编代码编译上,可能是汇编器不兼容或者汇编代码本身的问题。可以尝试: - 禁用汇编优化:在配置时添加`--disable-asm`,但这会影响性能。 - 或者,更新FFmpeg版本:因为可能是旧版FFmpeg的汇编代码对新的交叉编译工具链支持不好。 4. **检查依赖库**: 确保所有依赖库(如zlib, libpng等)已经用相同的交叉编译工具链编译并安装到交叉编译的sysroot中。 5. **查看详细错误日志**: 运行`make`时加上`V=1`(详细输出)以获取具体的错误信息,例如: ``` make V=1 ``` 从详细输出中,我们可以看到编译`videodsp_init.o`时使用的命令以及具体的错误原因。 6. **可能的补丁**: 如果确定是FFmpeg的问题,可以尝试寻找相关的补丁。例如,有些情况下需要修改FFmpeg的configure脚本或汇编代码以适应特定的交叉编译环境。 7. **使用预编译的FFmpeg**: 如果MPlayer允许使用外部的FFmpeg库,可以尝试先交叉编译FFmpeg,然后在配置MPlayer时指定FFmpeg的路径,例如: ``` ./configure ... --extra-cflags="-I/path/to/cross/ffmpeg/include" --extra-ldflags="-L/path/to/cross/ffmpeg/lib" ``` 根据常见的解决方案,我们可以按照以下步骤操作: **步骤1:设置交叉编译环境变量** 例如,对于aarch64-linux-gnu工具链: ```bash export CC=aarch64-linux-gnu-gcc export CXX=aarch64-linux-gnu-g++ export AR=aarch64-linux-gnu-ar export LD=aarch64-linux-gnu-ld export STRIP=aarch64-linux-gnu-strip export RANLIB=aarch64-linux-gnu-ranlib ``` **步骤2:配置MPlayer时禁用汇编优化(尝试)** ```bash ./configure --target=aarch64-linux --host=aarch64-linux --disable-asm ``` 如果这样能通过,说明是汇编代码的问题。但为了性能,我们可能希望启用汇编,所以需要进一步解决。 **步骤3:如果步骤2无效,尝试更新FFmpeg** MPlayer自带的FFmpeg可能较旧,可以尝试更新MPlayer中的FFmpeg子模块(如果支持),或者使用外部FFmpeg(先交叉编译FFmpeg)。 **步骤4:交叉编译FFmpeg** 下载FFmpeg源码,然后交叉编译: ```bash ./configure --prefix=/path/to/cross/ffmpeg \ --arch=aarch64 \ --target-os=linux \ --enable-cross-compile \ --cross-prefix=aarch64-linux-gnu- \ --disable-asm # 如果汇编有问题,先禁用试试 make && make install ``` 然后在MPlayer配置中指定这个FFmpeg路径。 **步骤5:检查具体错误并打补丁** 如果错误信息指向具体的汇编文件,可以尝试修改该文件。例如,可能是汇编语法与交叉编译器的汇编器不兼容(如GAS和ARMASM的差异)。有时在汇编文件中添加`.arch`或`.cpu`指令可以解决。 由于没有具体的错误信息,以上是常见的解决思路。 根据经验,有一个类似的错误报告:在交叉编译aarch64时,FFmpeg的`videodsp_init.c`会调用`ff_videodsp_init_aarch64`函数,而该函数在`videodsp.asm`中实现。如果汇编器不支持某些指令,或者汇编文件中的指令写错了,就会失败。 建议先运行`make V=1`查看详细错误,然后根据错误信息进一步分析。 如果错误信息是“unexpected token”或“unknown instruction”,可能是汇编代码使用了交叉汇编器不支持的指令。此时可以尝试更新交叉编译工具链,或者修改汇编代码。 例如,有报告称在aarch64的汇编代码中,`ld1`指令的参数顺序问题会导致错误。可以尝试修改FFmpeg源码中的对应汇编文件(如`libavcodec/aarch64/videodsp.S`)来修复。 由于无法直接看到错误,这里提供一般性解决步骤。请根据实际错误信息调整。 如果上述步骤仍然无法解决,请提供详细的错误输出。 </think>要解决交叉编译 MPlayer 时出现的 `libavcodec/aarch64/videodsp_init.o` 和 `ffmpeg/libavcodec/libavcodec.a` 编译错误,请按照以下步骤排查: ### 1. **确认交叉编译工具链配置** - 检查环境变量是否正确定义: ```bash export CC=aarch64-linux-gnu-gcc # 替换为你的交叉编译器 export CXX=aarch64-linux-gnu-g++ export LD=aarch64-linux-gnu-ld export AR=aarch64-linux-gnu-ar export RANLIB=aarch64-linux-gnu-ranlib ``` - 验证工具链兼容性: ```bash ${CC} -v # 检查编译器版本 file $(which ${CC}) # 确认编译器架构 ``` ### 2. **禁用汇编优化(临时解决)** 在 `configure` 阶段添加 `--disable-asm` 关闭汇编优化: ```bash ./configure \ --target=arm-linux \ --host=aarch64-linux-gnu \ --disable-asm # 关键选项 ``` > **说明**:此操作可绕过汇编代码编译错误[^1],但会牺牲性能。 ### 3. **检查 FFmpeg 子模块兼容性** 更新 FFmpeg 子模块到兼容版本: ```bash cd ffmpeg git checkout release/4.4 # 尝试稳定分支 cd .. make clean ``` ### 4. **修复汇编代码配置** 修改 `configure` 文件避免 aarch64 检测错误: ```diff # 在 configure 中搜索 "aarch64" - case $arch in + case $target_arch in # 替换为 target_arch ``` ### 5. **完整编译流程** ```bash make distclean # 彻底清理 ./configure \ --prefix=/opt/mplayer_aarch64 \ --target=arm-linux \ --host=aarch64-linux-gnu \ --disable-asm \ --cc=${CC} \ --extra-cflags="-O2 -fPIC" # 添加优化标志 make -j$(nproc) V=1 # 显示详细编译日志 ``` ### 6. **常见错误解决方案** - **若报错 "Unknown CPU"**: 在 `configure` 时显式指定 CPU: ```bash --extra-cflags="-mcpu=cortex-a72" # 替换为目标芯片型号 ``` - **若报错 "relocation truncated"**: 增加内存模型: ```bash --extra-cflags="-mcmodel=large" ``` - **若需保留汇编优化**: 在 `ffmpeg/configure` 中添加 `--disable-aarch64` 仅禁用问题模块。 ### 验证成功编译 ```bash file mplayer # 应显示 "ELF 64-bit LSB executable, ARM aarch64" ``` > **根本原因**:此类错误通常源于交叉编译工具链与 FFmpeg 汇编代码的兼容性问题,aarch64 汇编指令集支持不完整是主因[^2]。建议优先尝试步骤 2 和 4。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值