当前位置: 首页 > article >正文

在Windows上用MSYS2编译旧版FFmpeg,遇到`shr`汇编错误?手把手教你改两行代码搞定

在Windows上用MSYS2编译旧版FFmpeg的shr汇编错误解决方案当你在Windows平台上使用MSYS2环境编译较老版本的FFmpeg时可能会遇到一个令人困惑的汇编错误Error: operand type mismatch for shr。这个问题通常出现在使用新版本的GCC工具链如13.2.0编译2018年或更早的FFmpeg源码时。本文将深入分析这个问题的根源并提供两种有效的解决方案。1. 问题背景与错误分析在软件开发中向后兼容性是一个永恒的话题。当你尝试用现代工具链编译历史代码时经常会遇到各种意料之外的问题。这个特定的shr汇编错误就是一个典型案例。1.1 错误现象典型的错误输出如下D:\msys2\tmp\ccUxvBjQ.s:345: Error: operand type mismatch for shr D:\msys2\tmp\ccUxvBjQ.s:410: Error: operand type mismatch for shr ... make: *** [ffbuild/common.mak:60: libavformat/adtsenc.o] Error 1这些错误发生在汇编阶段表明编译器生成的汇编代码与汇编器的期望不匹配。1.2 根本原因问题的根源在于GCC内联汇编语法和约束条件的变化。具体来说GCC版本差异新版本GCC如13.2.0对汇编指令的操作数类型检查更加严格历史代码假设旧版FFmpeg中的内联汇编代码基于早期GCC版本的行为编写约束条件变化特别是ci约束与i约束在处理立即数时的行为发生了变化在旧版代码中常见的形式是__asm__ (shrl %1, %0\n\t : r (a) : ic ((uint8_t)(-s)) );而新版GCC期望的形式是__asm__ (shrl %1, %0\n\t : r (a) : c ((uint8_t)(-s)) );2. 解决方案一直接修改mathops.h这是最直接的解决方法适用于需要快速解决问题的场景。2.1 修改步骤定位到FFmpeg源码中的libavcodec/x86/mathops.h文件找到以下三个函数的定义MULLNEG_SSR32NEG_USR32修改约束条件将ci改为i将ic改为c具体修改如下#define MULL MULL static av_always_inline av_const int MULL(int a, int b, unsigned shift) { int rt, dummy; __asm__ ( imull %3 \n\t shrdl %4, %%edx, %%eax \n\t :a(rt), d(dummy) :a(a), rm(b), i(shift 0x1F) ); return rt; } #define NEG_SSR32 NEG_SSR32 static inline int32_t NEG_SSR32(int32_t a, int8_t s){ __asm__ (sarl %1, %0\n\t : r (a) : c ((uint8_t)(-s)) ); return a; } #define NEG_USR32 NEG_USR32 static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ __asm__ (shrl %1, %0\n\t : r (a) : c ((uint8_t)(-s)) ); return a; }2.2 优缺点分析优点修改简单直接不需要参考其他版本代码适用于紧急修复缺点可能不是最规范的解决方案没有考虑其他潜在兼容性问题3. 解决方案二参考新版FFmpeg的修改这是一种更规范的解决方案建议在非紧急情况下使用。3.1 实施步骤查看最新版FFmpeg中的libavcodec/x86/mathops.h文件将旧版代码更新为与新版一致的形式具体修改如下#define MULL MULL static av_always_inline av_const int MULL(int a, int b, unsigned shift) { int rt, dummy; __asm__ ( imull %3 \n\t shrdl %4, %%edx, %%eax \n\t :a(rt), d(dummy) :a(a), rm(b), c((uint8_t)shift) ); return rt; } #define NEG_SSR32 NEG_SSR32 static inline int32_t NEG_SSR32(int32_t a, int8_t s){ __asm__ (sarl %1, %0\n\t : r (a) : c ((uint8_t)(-s)) ); return a; } #define NEG_USR32 NEG_USR32 static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ __asm__ (shrl %1, %0\n\t : r (a) : c ((uint8_t)(-s)) ); return a; }3.2 优缺点分析优点与官方解决方案一致经过了更全面的测试可能修复了其他潜在问题缺点需要查找新版代码修改量可能略大4. 验证与编译无论采用哪种解决方案修改后都需要验证是否解决了问题。4.1 验证步骤保存修改后的mathops.h文件清理之前的编译结果make clean重新开始编译make观察是否还有shr相关的汇编错误4.2 常见问题如果修改后仍然出现错误请检查是否修改了正确的文件是否保存了修改是否执行了make clean是否有其他文件包含类似的内联汇编代码提示在某些情况下可能需要修改多个文件中的类似代码模式。建议在代码库中搜索所有shr相关的内联汇编语句。5. 深入理解问题本质为了更好地理解这个问题我们需要了解一些底层细节。5.1 GCC内联汇编的变化GCC对内联汇编的处理在版本演进中发生了若干变化约束条件语义新版GCC对约束条件的解释更加严格立即数处理对立即数参数的类型检查更加精确寄存器分配寄存器使用策略有所调整5.2 汇编指令的演变shr右移指令在x86架构中有多种形式指令描述操作数限制shrb字节右移8位操作数shrw字右移16位操作数shrd双字右移32位操作数shrq四字右移64位操作数新版GCC更严格地执行这些限制而旧版则较为宽松。5.3 兼容性考虑在维护历史代码时需要考虑以下兼容性因素工具链版本编译器、汇编器、链接器的版本组合目标架构32位与64位系统的差异操作系统ABIWindows与Linux等系统的调用约定差异6. 预防类似问题的建议为了避免将来遇到类似的兼容性问题可以考虑以下实践定期更新代码库保持代码与最新稳定版接近锁定工具链版本在项目中明确指定编译器版本使用CI/CD设置持续集成环境及早发现问题文档记录记录已知的兼容性问题和解决方案对于必须使用旧版FFmpeg的场景建议维护一个补丁文件记录所有必要的修改在项目文档中明确说明所需的工具链版本考虑使用容器化技术固定开发环境7. 扩展知识其他可能遇到的兼容性问题除了shr汇编错误外在使用新工具链编译旧代码时还可能遇到语法变更C/C标准的演进导致的语言特性变化库函数废弃某些函数在新版本中被标记为废弃头文件位置变化系统头文件的组织方式改变默认编译选项调整如C的默认标准版本提升对于FFmpeg编译还需要注意外部依赖库的版本兼容性配置选项的变更平台特定代码的维护状态在实际项目中遇到编译错误时系统性的排查步骤应该是精确阅读错误信息确认环境配置搜索相关问题的报告分析代码历史变更尝试最小化复现验证解决方案的有效性

相关文章:

在Windows上用MSYS2编译旧版FFmpeg,遇到`shr`汇编错误?手把手教你改两行代码搞定

在Windows上用MSYS2编译旧版FFmpeg的shr汇编错误解决方案 当你在Windows平台上使用MSYS2环境编译较老版本的FFmpeg时,可能会遇到一个令人困惑的汇编错误:"Error: operand type mismatch for shr"。这个问题通常出现在使用新版本的GCC工具链&am…...

【AI面试临阵磨枪-27】CoT、ToT、Plan-and-Solve、Plan-and-Execute 分别是什么?适用场景?

一、面试题目请你分别说明 CoT、ToT、Plan-and-Solve、Plan-and-Execute 四种大模型推理范式的核心定义,并对比各自的适用业务场景。二、知识储备1. CoT(Chain-of-Thought 思维链)核心定义最简单的线性推理范式,引导模型不直接给出…...

Spring Batch 中的异步处理与多线程策略

在使用Spring Batch进行大规模数据处理时,性能优化是一个关键问题。特别是当我们面对大量数据需要处理时,如何有效利用系统资源来提高批处理速度变得尤为重要。本文将深入探讨Spring Batch中的异步处理和多线程策略,通过实例说明如何在实际项目中应用这些技术。 异步处理的…...

周菜单生成器:基于规则引擎与约束优化的自动化饮食规划方案

1. 项目概述:从“今天吃什么”到自动化周菜单生成“今天吃什么?”这个问题,大概是每个需要自己动手解决三餐的人,每周都要面对的灵魂拷问。无论是为了健康饮食、控制预算,还是单纯想摆脱“外卖选择困难症”&#xff0c…...

架构解析:用C实现Nintendo Switch模拟器的完整技术路径

架构解析:用C#实现Nintendo Switch模拟器的完整技术路径 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一个使用C#编写的开源Nintendo Switch模拟器,…...

AI生成代码检测:方法与工程实践

1. 项目概述"Detecting Machine-Generated Code: Unveiling Patterns in AI-Generated Programming"这个项目直指当前软件开发领域最前沿的挑战之一——如何识别AI生成的代码。作为一名长期关注代码质量与工程实践的开发者,我亲眼见证了AI编程助手从简单的…...

【2026最新版】小白程序员必看!AI Agent从入门到实战全解析(建议收藏)

对于刚入门大模型的小白,或是想拓展技术边界、抢占职场先机的程序员来说,AI Agent绝对是2026年最值得重点深耕的核心方向——它彻底打破了传统大模型“只输出、不落地”的局限,真正实现了“思考决策执行”一体化,堪称未来职场最具…...

平面设计史:从印刷术到数字时代的视觉传达演变

1. 视觉传达的千年演化史当我在设计学院第一次翻开厚重的《平面设计史》教材时,被那些泛黄的老海报震撼得说不出话——原来今天我们认为理所当然的排版规则、色彩搭配甚至字体选择,都是无数先驱者用几十年时间摸索出的智慧结晶。从洞穴壁画到数字界面&am…...

答辩前知网AI率超标:比话降AI快速处理实测降幅2026

答辩前知网AI率超标:比话降AI快速处理实测降幅2026 答辩前一天,导师群里转发学校的最终送检结果——同学的稿件知网 AIGC 64.2%,要求 20% 以内,差着 44 个百分点。第二天上午十点就要答辩,现在是晚上九点。这种情况下&…...

投票小程序怎么做?支持礼物投票+视频投票,多用户开账号

温馨提示:文末有资源获取方式最近很多朋友在问投票小程序怎么搭建,尤其是想要支持礼物打赏、视频投票这类功能。我整理了一套比较实用的方案,分享给大家。源码获取方式在软媒源码阁。一、功能需求清单礼物投票:用户可购买虚拟礼物…...

基于深度学习残差网络的复杂工业过程故障识别【附源码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)多维度特征融合与深度重构残差的故障检测方法&…...

比话降AI知网实测:AI率从84.9%降到1.4%全程数据2026

比话降AI知网实测:AI率从84.9%降到1.4%全程数据2026 答辩前 36 小时,朋友的硕士论文知网 AIGC 跑出 84.9%,几乎是"全文标红"的级别。这种分数靠人工改根本来不及,最后用比话降AI 跑了一次完整流程,结果回到 …...

【VS Code MCP企业级落地指南】:20年架构师亲授5大高频场景插件组合拳,错过再等一年

更多请点击: https://intelliparadigm.com 第一章:VS Code MCP插件生态搭建手册 MCP 协议与 VS Code 集成原理 MCP(Model Context Protocol)是面向大模型工具调用的开放协议,VS Code 通过官方语言服务器协议&#xf…...

AI智能体指令跟随技术:核心挑战与AgentIF-OneDay基准测试

1. AgentIF-OneDay基准测试框架解析1.1 指令跟随技术的核心挑战指令跟随能力是评估AI智能体实用性的黄金标准。在真实场景中,一个合格的智能体需要同时具备以下三种核心能力:显式指令解析:能够准确理解用户直接表达的需求。例如在科研文献整理…...

Tencent InstantCharacter跨平台AI角色生成工具解析

1. 项目概述Tencent InstantCharacter一键安装包是一个针对不同硬件平台优化的AI角色生成工具解决方案。这个项目最吸引人的地方在于它提供了跨平台的兼容性支持,从本地Windows环境到云端的RunPod和Massed Compute平台,甚至专门针对RTX 5000系列显卡进行…...

Python机器学习入门:环境配置与实战指南

1. Python机器学习入门指南第一次接触机器学习的新手常会陷入"从哪开始"的困惑。三年前我指导一个生物信息学团队时,他们用Python分析基因序列的初期,就卡在特征工程和模型选择的衔接环节。本文将以真实项目经验为基础,拆解Python机…...

如何用G-Helper优化华硕笔记本性能:从性能瓶颈到极致体验的完整指南

如何用G-Helper优化华硕笔记本性能:从性能瓶颈到极致体验的完整指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, T…...

Redis如何记录每一次写操作_开启AOF持久化机制实现命令级追加记录

Redis AOF 是将写命令追加到文件以实现持久化,但并非所有场景都适用:appendfsync 配置影响安全性与性能,everysec 是线上折中选择,always 性能差,no 不可靠;AOF 重写可能耗资源,切换时需检查文件…...

[SEO艺术重读] 第5篇 关键词研究实施

本文是「SEO重读」系列第5篇 系列共15篇,完整目录见[SEO艺术重读] 作者:[Adair] 上一篇:[SEO艺术重读 第4篇 SEO实施:第一阶段] 下一篇:[SEO艺术重读 第6篇 创建SEO友好型网站] 关键词研究的理论基础 在搜索…...

【边缘AI推理部署革命】:Docker+WASM+WebGPU三栈融合,实测吞吐提升4.2×(仅限首批内测开发者)

更多请点击: https://intelliparadigm.com 第一章:Docker WASM 边缘计算部署指南 WebAssembly(WASM)正迅速成为边缘计算场景中轻量、安全、跨平台执行代码的核心载体,而 Docker 官方已通过 docker/wasmedge-plugin 和…...

AI系统卡:实现AI透明化的关键技术与实践

1. AI系统卡:透明化AI系统的技术基石在医疗AI误诊导致患者伤害、聊天机器人泄露敏感数据的案例频发的当下,AI系统的透明度和可追溯性已成为行业痛点。传统文档往往滞后于系统迭代,而AI系统卡(AI System Card)通过机器可…...

5分钟掌握OBS模糊插件:专业视频特效处理完全指南

5分钟掌握OBS模糊插件:专业视频特效处理完全指南 【免费下载链接】obs-composite-blur A comprehensive blur plugin for OBS that provides several different blur algorithms, and proper compositing. 项目地址: https://gitcode.com/gh_mirrors/ob/obs-compo…...

KeymouseGo:跨平台鼠标键盘自动化录制与回放解决方案

KeymouseGo:跨平台鼠标键盘自动化录制与回放解决方案 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo KeymouseG…...

CALM框架:连续向量空间语言建模技术解析

1. CALM框架概述:连续向量空间的语言建模革命在传统语言模型(LM)领域,自回归式逐标记(token-by-token)生成已成为标准范式。这种方法的计算效率受限于序列长度,生成长文本时需要执行数百甚至上千次前向传播。CALM(Continuous Autoregressive …...

3D点云标注成本降67%,推理速度提4.2倍:用Python+LabelCloud+MMPoint3D打造自主可控工业标注流水线

更多请点击: https://intelliparadigm.com 第一章:3D点云标注成本降67%,推理速度提4.2倍:用PythonLabelCloudMMPoint3D打造自主可控工业标注流水线 在智能工厂质检、自动驾驶感知与机器人导航等工业场景中,高精度3D点…...

扩散模型生成图像的纹理差异分析与优化

1. 项目概述在计算机视觉和图像生成领域,扩散模型(Diffusion Models)已经成为当前最先进的图像生成技术之一。然而,随着这些模型生成的图像质量不断提高,研究人员开始关注一个更深层次的问题:这些生成图像在…...

Windows风扇控制终极方案:Fan Control开源工具完全指南

Windows风扇控制终极方案:Fan Control开源工具完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

深度研究代理架构解析与安全防御实践

1. 深度研究代理的技术架构与核心机制深度研究代理(Deep Research Agents)代表了当前大语言模型(LLMs)应用的最前沿技术范式。这种系统通过将传统检索增强生成(RAG)与自主代理决策相结合,构建了…...

机器人多模态融合:三维视觉与语言指令的协同优化

1. 项目背景与核心挑战在机器人智能化发展的进程中,视觉-语言-动作多模态融合一直是关键突破口。我们团队在开发新一代服务机器人时发现,现有模型在复杂家居环境中的操作成功率不足60%,主要瓶颈在于三维空间理解与动作执行的协同性。这个问题…...

Elasticsearch:智能搜索 - AI builder 及 skills

想象一下,我们如何搜索如下的一个问题: Find a home within 10 miles of Miami, Florida that has 2 bedrooms, 2 bathrooms, central air, and tile floors, with a budget up to $300,000. 这类问题存在于很多的电子商务网站搜索中。它也是一种非常实…...