linux - linux-gcc编译后的C代码输出和MS-VS2008编译后的输出相差1位的原因?

标签 linux gcc ffmpeg ogg-theora

我有一个 Theora 视频解码器库和在 Windows(Intel x86 架构)上使用 VS-2008 编译的应用程序。我使用此设置来解码 theora 比特流(*.ogg 文件)。该解码器库的源代码使用 FFMPEG v0.5 源码包,并进行了一些修改,使其可以在 windows-VS-2008 组合上编译。

现在,当我使用我使用 gcc 构建的 linux(Intel x86 架构)上的 ffmpeg(V0.5) 应用程序解码相同的 theora 比特流,并获得一些解码输出 yuv 文件时,该输出文件与从 windows-VS2008 安装程序获得的输出,以及输出文件的几个字节,而不是全部。我希望这 2 个输出是位匹配的。

我怀疑以下因素:

a.)两个编译器 gcc 和 MS-VS2008 之间的某些数据类型不匹配?

b.)我已经验证代码没有使用任何运行时数学库函数,如 log、pow、exp、cos 等......但我的代码仍然有一些操作,如 (a+b+c)/3.这会是个问题吗?

此“除以三”或任何其他数字的实现在两种设置中可能不同。

c.) 某种舍入/截断效果以不同方式发生?

但我无法缩小问题的范围并解决它。

1.) 我的怀疑是否有效,或者是否存在任何其他问题可能导致这两种不同设置产生的输出中出现这些 1 位差异。

2.) 我该如何调试和修复这个问题?

我想,这种 linux-gcc 设置和 Windows MS 编译器之间输出差异的场景甚至可以适用于任何通用代码(不一定特定于我的视频解码器应用程序)

关于此的任何指示都会有所帮助。

谢谢,

-广告

最佳答案

我认为,这种行为可能来自 x87/sse2 数学。你使用什么版本的gcc?您使用 float(32 位)还是 double(64 位)? x87 上的数学在内部具有更多的精度位 (82),超过了可以存储在内存中的精度

尝试为 gcc -ffloat-store 设置标志; -msse2 -mfpmath=sse

msvc /fp:fast/arch:SSE2 的标志

关于linux - linux-gcc编译后的C代码输出和MS-VS2008编译后的输出相差1位的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2232042/

相关文章:

c++ - 如何查看接口(interface)是否启动

c - 从 C 中的给定文件中查找最近访问的文件

linux - 如何在linux命令行上读取rar文件注释

c++ - Eclipse 不解析 gcc 输出

bash - ffmpeg - 超线程导致 "Conversion failed"具有多个并行实例

linux - 是否可以边执行边调试程序?

gcc 使用 newlib 而不是 glibc?

编译一个 C 项目和两个库

ffmpeg - 有人可以帮我在 Ubuntu 中安装 netflix 的 VMAF 库吗

android - 编译ffmpeg库时出错