问题标签 [binary-compatibility]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2387 浏览

c++ - ABI 兼容性标头/库交叉检查

我一直在寻找 ABI 交叉检查工具。现在我遇到了其他问题中建议的一些工具,例如这些问题:

如何自动测试二进制兼容性?

用于检测 C++ 中 ABI 中断的静态分析工具

现在,这并不是我想要做的——因为这些跟踪 ABI 版本之间的变化。

我想知道给定的项目源文件 + 库头文件和库 .so 文件,以及编译器版本(用于编译库和项目),是否可以交叉检查 ABI 的输出匹配编译的库?

因此,它适用的情况是上游库是否提供了 libfoo.so 和 libfood.so。食物的 ABI 略有不同(比如双精度数而不是浮点数),但到目前为止它不会编译。

  • 是否有可能提出一个测试(可能不是防弹的),说明编译的可执行文件已链接到正确的库?
  • 有没有工具可以做到这一点?
0 投票
2 回答
6215 浏览

c++ - Visual Studio 版本之间的库 ABI 兼容性

我有两种情况。假设我有 3 个导出 C++ 符号的共享库,每个库都是用 VS7.1、VS8 和 VS9 构建的。我在 VS9 中编译了所有 3 个。出于某种原因,这行得通。我不需要为 VS9 链接器重新编译 VS9 中的前 2 个库来成功找到符号并链接它们。

现在,如果我有一个只使用 C 语法(extern "C")导出符号的库,这是否相同?我听说有人说 C 的 ABI 是标准化的,因此可以保证您可以在所有版本的 Visual Studio 中使用在 Visual Studio 8 中编译的 C 库。

基本上,所有这些东西的组合是令人困惑的。我不确定在不同版本的 Visual Studio 之间链接 C++ 和基于 C 的共享库(使用它们相应的导入库)之间有什么保证。我想听到关于 CC++ 导入或静态库在任何其他版本的 Visual Studio 上的向前/向后兼容性的普遍共识。

我之所以出现这种情况,是因为我使用的一些闭源库是在 Visual Studio .NET 2003 (VS7.1) 中编译的。我的团队认为这将我们锁定在 VS 7.1 编译器上,但是我已经在 VS8 和 VS9,甚至 VS2010 中测试了这些库,并且它们链接得很好。但是,我不确定这其中的内在危险。请注意,有问题的库有一个 C 变体和一个 C++ 变体。基本上,C 变体是标准 C 导出,而 C++ 库是 C 库和导出类的抽象。

0 投票
3 回答
7283 浏览

java - Java 二进制兼容性问题:sun.font.FontManager 类成为接口

我正在使用Lobo - Java Web Browser library,它给了我一个例外,经过一些研究,我确定这可能是由于该库已针对旧版本的 Java 编译。

代码如下:

堆栈跟踪是:

当我检查时,org.lobobrowser.util.gui.FontFactory.createFont我发现有一个名为的接口FontManager与以前的 Java 版本不同。在这个FontFactory类中,他们使用了一个不再可用的这个接口的类。我该如何解决这个问题?

界面FontManager

以及库中使用的类不可用:

0 投票
2 回答
412 浏览

java - 使用公共字段以外的 getter/setter 来实现二进制兼容性?

我正在阅读“实用 API 设计”并找到以下段落:

在 JVM 规范中可以找到更喜欢方法而不是字段的另一个原因。您可以将方法从一个类移动到其超类之一,并且仍然保持二进制兼容性。因此,最初作为 Dimension javax.swing 引入的方法.JComponent.getPreferredSize(Dimension d) 可以在新版本中删除并移至 Dimension java.awt.Component.getPreferredSize(Dimension d),因为 JComponent 是 Component 的子类。这样的变化在 JDK 1.2 中确实发生过,这只能是因为字段被方法封装了。这样的操作是不允许对字段进行的。一旦在一个类中定义了一个字段,它就必须永远留在那里以保持二进制兼容性,这是另一个原因保持字段私有

因为我同意使用 getter/setter 是更好的方法。但我不明白为什么将公共字段移动到父类会破坏二进制兼容性?只要它在父类中是公共的,您仍然应该能够通过子类访问该字段。

0 投票
1 回答
326 浏览

linux - 为什么 Linux rpm 是特定于操作系统的

假设我有一个为 SUSE Linux Enterprise Server(SLES) 构建的 rpm,我想在 Red Hat Enterprise Linux 中安装相同的 rpm。

  • 我会在这里遇到任何架构依赖问题吗?
  • 在另一个操作系统中安装为一个操作系统构建的 rpm 的主要问题是什么?
  • 即使它已安装,之后我可能会遇到任何功能问题吗?
0 投票
4 回答
143 浏览

java - 删除“final”关键字会影响二进制兼容性吗?

如果我final从方法或其他“事物”中删除关键字,我的类的用户是否必须重新编译?

0 投票
3 回答
24110 浏览

installation - 不同版本的 glibc 的兼容性如何?

具体来说:

  1. 是否以某种方式确保所有版本的 glibc 2.x 都是二进制兼容的?

  2. 如果没有,我如何在我的系统上运行已针对不同版本编译的二进制文件(游戏)?我可以在不同的文件夹中安装 glibc 吗?

我的具体问题是 glibc 2.14(我拥有的)和 2.15(游戏想要的)之间的兼容性。

我可能还会获得 glibc 2.13 的版本,但我不确定它是否会在 2.14 上运行。

0 投票
2 回答
301 浏览

c++ - API 中的“final”关键字能否以 C++11 为条件?

final在头文件中对标准版本有条件地启用 C++11 关键字是个好主意吗?我在想类似的东西:

我在这里有两个疑问:

  1. 有和没有的方法是否与finalABI 兼容(对我来说假设是合理的,并且快速检查g++证实了这一点),
  2. 当有人试图重写该方法时,C++98 编译器不会抱怨。但我相信将方法记录为不覆盖它应该可以处理这个问题。
0 投票
3 回答
216 浏览

scala - 移动包私有类——我应该认为二进制不兼容吗?

由于auxWindows 下的包名称存在问题,我正在从库的包层次结构中移动一个帮助类

该类是库私有的,即private[scalainterpreter] object Helper.

现在使用Typesafe Migration-Manager,显然它报告更改不兼容:

但我怀疑如果客户端代码没有调用任何一个对象,接口仍然兼容,因此我可以使用小版本增加来表示更改,并允许这两个版本互换使用。

正确的?

0 投票
2 回答
356 浏览

c++ - 文件系统中的数据结构存储

我正在尝试用 C++ 编写一个持久性数据结构,但是我觉得我应该能够使它与我的数据结构阅读器的各种其他实现二进制兼容,因此,我目前的想法是在本机内存中声明数据结构而不进行任何抽象.

例如,我会指定一个线性内存块作为数据结构(使用new关键字),然后描述第一个字节的含义,第二个字节的含义等等。我知道我可以这样做,struct但是随后,数据结构将绑定到一种语言,而其他语言将不得不使用这种结构。此外,实现可能会从编译器更改为编译器。相反,我希望它作为内存标准。

我想做的事情有点明智吗?或者我试图过度简化事情并且真的应该继续使用struct数据结构?现在进入 C++ 部分,如果您认为我应该使用struct数据结构,那么使用成熟的类有什么缺点?

(无论如何,我都在使用一个类来包装内存结构并为其提供函数,因为数据结构无论如何都是持久的。) 编辑 正如贾斯汀所建议的那样,我不需要任何围绕内存结构的高级接口包装器,所以我的最后一点关于类包装器的说明不正确。我的意思是我想要一个用于内存表示的类接口,它不一定是包装器。