问题标签 [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 回答
1594 浏览

c++ - 接口(抽象类)与其他虚拟更改的 ABI 兼容性

即使在派生类中进行了涉及虚拟的其他更改,类视图的 ABI 是否保持稳定?

也就是说,假设我有一个接口InterfaceA(具有许多纯虚函数的抽象类)和一个DerivedB从它继承的类。我编写了一个库,该库具有采用InterfaceA *. 我想知道的是,只要接口本身不改变,接口是否保持二进制兼容。

清楚,如果我修改InterfaceA我不希望代码是二进制兼容的。但是,如果我只是修改DerivedB,比如说我继承更多接口或添加其他虚拟功能。在最极端的情况下,我从另一个定义InterfaceA. 尽管有所有这些变化,是否InterfaceA仍保持二进制兼容?

到目前为止,我的假设和经验是,是的,它是兼容的。我只是在寻找对此的确认(如果不兼容,则进行反驳)。

注意:我不关心动态类型或其他类型转换,我只关心接口函数本身。

另请注意:假设正在使用的编译器版本整体上是 ABI 稳定的——没有主要版本更改。

0 投票
1 回答
75 浏览

java - 关于java Runtime自写公共API兼容性

我刚刚遇到一个关于更改 API 的真正问题。我想更多地了解这个话题。使用以下示例作为演示。

有 4 个简单的类,子类扩展了父类。PubAPI 是提供公共方法以供使用的类。客户端类调用 PubAPI 的公共方法。

前 3 类由 API 制造商提供,假设上面的版本是版本 1。

在版本 2 中,PubAPI 类更改为返回子类型:

3 API 提供者类现在在版本 2 中,而如果我们不重新编译“客户端”类并使用其版本 1 生成的类文件。IT 将在 java 运行时失败,并出现错误找不到版本 1 方法(因为返回类型更改)。

我以前不知道,我想知道是否有人对这个主题有更多了解,例如,如果公共 API 添加了一个 throw,或者添加了一个同步或类成为 final 等。在这种情况下,将如何他有。

总之,其他人使用的 API 类的公共 API/类字节码级别兼容性规则是什么。

谢谢。

0 投票
3 回答
3444 浏览

cocoa-touch - 有条件地链接@autoreleasepool

当我尝试在 iOS 4.3 模拟器 (Xcode 4.2) 中运行我的应用程序时,当我点击 @autoreleasepool{} 时我崩溃了,并且:

我环顾四周,发现解决方法是添加libarclite_iphoneos.a. 模拟器也有一个版本,如libarclite_iphonesimulator.a.

我需要将这两个库都添加到我的项目中,以使其在模拟器和硬件上运行。但是无论我构建哪个,它都会抱怨另一个库是针对不受支持的架构的。

例如,为模拟器构建:

如何同时解决这两个问题?还是我NSAutoreleasePool现在应该坚持使用旧语法?

0 投票
1 回答
1751 浏览

c# - 添加属性时,如何保持 .NET 程序集的 COM 二进制兼容性?

我们开发了一个存储语言翻译信息的 .NET 程序集,它需要由 VB6 应用程序使用。

我们希望能够更改翻译信息而无需重新编译应用程序。

翻译由名为 LanguageServices 的两文件分部类提供。

一个文件是不变的库方法,另一个是所有从 resx 文件自动生成的属性,而 regx 是从语言翻译信息数据库生成的。

这一切都源于需要有一个中央翻译数据库,该数据库可以通过编程方式“扁平化”为我们每个不同的应用程序可以使用的格式。

现在,我可以通过绕过它并以不同的方式来解决这个问题。事实上,我可以摆脱自动生成的属性列表,问题就会消失。

我感兴趣的是如何解决这个问题,即:

如果我们向数据库添加新的翻译标签(THIS WORD 中的 THIS WORD 变为 THAT WORD),它会向类添加新属性,进而向 COM 接口添加新的公开属性。

这些属性被添加到 COM 接口的中间,从而破坏了二进制兼容性。它们被添加到中间是因为 C# 编译器在部分类的动态部分后缀为部分类的静态部分。我需要它做的是将它们以另一种方式连接起来,或者在 C# 文件本身中明确说明顺序。我认为在类的静态部分显式设置 DispID 可以做到这一点,但事实并非如此。

以下是构建过程生成的一对 IDL 文件:

这是我添加新属性之前的 IDL。

http://pastebin.com/qPvcUV9z

这是添加新属性并且兼容性被破坏后的 IDL:

http://pastebin.com/K2MuqtYV

确切的区别是这个位被推到了中间:

认为这就是问题所在,它改变了方法的顺序。我认为可以通过显式定义 DispID 来覆盖顺序(您可以看到从HRESULT Culture([in] ICultureInfo* pRetVal);开始的所有内容都有一个从 0 开始的 id。

这是编写/生成的 C# 代码:ILanguageServices.cs:自动生成的接口。

ILanguageServices_Static.cs:界面中不变的部分

想一想,我可能只是让它不是部分课程。只需更改生成自动生成部分的 xslt 以包含静态部分。把它分开真是太好了。

无论如何,谁能告诉我为什么它不工作以及如何更严格地控​​制 COM 接口?严格排序方法似乎是如此...... bleugh。

谢谢,

J1M。

0 投票
2 回答
911 浏览

c++ - Windows 上 C 库的二进制交叉编译器兼容性

我的问题与类似,但也涉及静态库:

我们有一个跨平台的 C++ 头库,它可以在 Windows/Linux/Os X 下很好地构建,适用于多个编译器,包括 32 位和 64 位。当用户安装了 zlib 或 libbz2 时,构建系统通过#ifdefs.

为了让我们的用户更容易使用,我们希望以二进制格式或作为源代码发布用于 Windows 的 zlib 和 libbz2 等库,只需点击几下即可安装。(在 Linux 和 Mac Os X 上,库可以简单地安装,因为系统包实际上在大多数标准安装中都可用,据我所知)。

最终的解决方案应该使用户能够在 32 位和 64 位 Windows 上使用 Visual C/C++ 编译器 2005、2008 和 2010 以及 MinGW,以便轻松链接到 zlib 和 libbz2。我们目前只关心 C 库和可预见的未来。

这些库应该单独构建,我们不想将构建它们集成到我们的构建系统中。

据我所知,这里至少有两个自由度:

  • 是否使用静态库或 DLL。
  • 是发布二进制库还是让用户构建自己的库。

另一点是用户应该能够将库链接到他们程序的调试和优化版本。我不是 Windows 编程方面的专家,但据我在 Internet 上和其他工作中的开发人员那里了解到,Windows 上的调试和发布版本之间存在这种(不寻常的?)区别。显然,您不能将调试程序与发布库链接,反之亦然。它是否正确?

好的,为了清楚起见,让我再次总结一下:(1)为我们的 C++ 编译器提供依赖 C 库的最佳方式是什么? (2) 如果我们以后还想发布 C++ 库,让用户使用每个编译器从源代码构建是唯一可行的方法,对吗?

0 投票
1 回答
528 浏览

unix - 如何构建二进制文件并在 Unix 的多台机器上使用它?

我有一个编译器的源代码,我正在构建这样的编译器:

我想将生成的“installdir”分发到其他机器,目的是任何人都可以使用编译器二进制文件而无需经过 3 阶段构建过程(我只是将 installdir 包含在我的分发 tarball 中)。

为了测试,我将 installdir 复制到另一个用户下的另一台机器上,然后尝试使用我刚刚复制的二进制文件编译测试程序,如下所示:

然后,我收到如下错误:

/home/sghosh/normalbuild/install是在我的构建机器上指定的--prefix内容configureinstalldir/bin/ucc二进制文件需要 installdir 下的目录中的一些文件,open64-gcc-4.2.0但由于这是 中提到的路径--prefix,所以它仍在那里寻找它,我希望它在当前机器中查看相同的目录。仅供参考,我没有 sudo/root 权限。

我如何想出一个可以在任何机器上工作的二进制发行版(构建一次,在任何地方使用),而不是--prefix在这种情况下查看初始路径?

我在超级用户中遇到过类似的问题,但是由于发生了很多编辑并且我没有对新问题做出回应,所以我在这里写了它。

0 投票
2 回答
1127 浏览

c++ - 在类中添加枚举定义会破坏其二进制向后兼容性吗?

我知道添加static成员函数很好,但是enum定义呢?没有新的数据成员,只是它的定义。


一点背景:

我需要添加一个static成员函数(在类中),它将IP通过字符串表示来识别(函数)地址的版本。我想到的第一件事是声明一个enumfor IPv4IPv6并为我的函数Unknown制作这个enum返回码。

但我不想破坏二进制向后兼容性。

还有一个非常糟糕的问题(对于 SO) - 这里有任何来源或问题,我可以阅读更多相关信息吗?我的意思是 - 什么破坏了二进制兼容性,什么 - 没有。或者它取决于很多东西(如架构、操作系统、编译器..)?


编辑:关于@PeteKirkham 的评论:好吧,至少 - 有没有办法测试/检查更改的ABI,或者最好发布关于此的新问题?

EDIT2:我刚刚发现了一个SO 问题:静态分析工具来检测 C++ 中的 ABI 中断 。我认为它在这里有某种关联,并回答了有关检查二进制兼容性的工具的部分。这就是为什么我在这里把它联系起来。

0 投票
1 回答
1666 浏览

vb6 - 规避 vb6 二进制兼容性

这或多或少是一个学术问题,可以帮助我更好地理解这个过程......与其说是要求弄清楚如何绕过二进制兼容性,那么就不需要解释为什么我不应该尝试这个:)

假设我在 vb6 中创建并编译了一个没有公共成员的 dll。实际上,我认为它可能不允许您在没有至少一个的情况下进行编译,所以假设我们创建了一个公共方法,但它只是为了让 dll 能够编译而我们忽略它。

现在假设我将项目兼容性设置为这个 dll,并且在任何情况下我都不会更新这个 dll 或将兼容性更改为 dll 的更新版本。

在这种情况下,我认为 vb6 永远不会抛出那些破坏兼容性的错误消息,并且即使您确实破坏了兼容性,也会在每次编译时继续为 dll 使用相同的 UUID。

但是,我认为为您在该 dll 中创建的类生成的值每次都会改变。即使您在编译该 dll 时不会遇到兼容性问题,但您最终仍会遇到引用此 dll 的项目的兼容性问题。

那个听起来是对的吗?

0 投票
3 回答
2595 浏览

c++ - STL 容器和二进制接口兼容性

STL 二进制接口

我很想知道是否有人正在为跨多个 C++ 编译器和平台的 STL 对象开发兼容的接口层。

目标是支持 STL 类型作为第一类或内在数据类型。

一般来说,模板是否存在一些固有的设计限制来防止这种情况发生?这似乎是使用 STL 进行二进制分发的主要限制。

理论——也许答案是务实的

  1. 微软已经在 .NET 上投入了精力,并不真正关心 C++ STL 支持是“一流的”。

  2. 开源并不想推广仅二进制分发,而是专注于使用单个编译器而不是 10 个不同版本的不匹配来解决问题。

这似乎得到了我对 Qt 和其他库的经验的支持——它们通常为您将要使用的环境提供构建。例如 Qt 4.6 和 VS2008。

参考:

0 投票
2 回答
218 浏览

c++ - 使用 VS2008 构建的 .lib 由 VS2005 构建的二进制文件使用

什么会阻止我在使用 Visual Studio 2005 编译的程序中与使用 Visual Studio 2008 构建的第三方 .lib 链接?谢谢