问题标签 [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.
java - 如何设计我的 Java / C# 库,以便在将来发生更改时保持二进制兼容?
任务:我正在设计一个供开发人员使用的库。
目标:我需要确保未来版本中的更改不会影响现有开发人员。
例子:
第一次发布时的情况:
有一类
第二次发布时的情况:
要求:
methodSample 的响应可以返回多个值。
methodSample 方法中需要更多参数。
解决方案:一种方法是添加另一个重载方法,该方法将具有新参数并返回对象而不是内置数据类型。
但是上述方案的问题是,以后重载的方法太多,参数太多会矫枉过正。
修改方案一:
在每个版本中(显然,如果需要),我将修改请求和响应类以具有新的附加方法来获取/设置值。在这种情况下会出现问题,因为在方法内部,我将无法区分调用者是 Version10 还是 Version20。
修改后的解决方案 2:
在每个版本中,我们都可以扩展派生类,例如 Request200 extends Request100 extends AbstractRequest,响应类类似。在这种情况下,我可以通过检查实例类型来检查方法内部调用者是 Version10 还是 Version20。
总而言之,修改后的解决方案 2 对我来说看起来不错,您的想法呢?
c++ - 可以在不重新编译客户端代码的情况下扩展虚拟接口吗?
库提供具有虚函数的类。可以用新的虚函数扩展这个类而不重新编译动态链接到库的二进制文件吗?
我相信这在标准中是不可能的。有平台允许吗?
如果只将新函数添加到类体的末尾,那会更容易吗?
terminology - 二进制兼容性与向后兼容性
我一直在阅读有关 Qt d-pointer 的一些详细信息,并遇到了二进制兼容性术语。这与向后兼容性相同吗?
c++ - STL 容器的二进制兼容性
假设我用 C++ 编写了一个 DLL,并且想导出一个采用 std::vector 参数的方法。我可以希望不同 STL 版本之间有任何二进制兼容性吗?
c++ - C++ 动态库编译/链接
我知道如果我将我的 c++ 程序链接到使用不同版本的 Visual Studio 构建的动态库 (DLL),由于二进制兼容性问题,它将无法工作。(我在 Boost 库和 VS 2005 和 2008 中体验过这一点)
但我的问题是:所有版本的 MSVS 都是这样吗?这也适用于静态库(LIB)吗?这也是 GCC 和 Linux 的问题吗?最后如何在 VS 中链接到使用 MinGW 构建的 DLL?
顺便说一句,除了跨平台或跨编译器,为什么同一编译器(VS)的两个版本不能兼容?
visual-c++ - 这个接口二进制文件在 MSVC 和 mingw 之间是否兼容?
我正在开发一个允许其用户(位于同一进程中的其他库)交换数据缓冲区和流的库。该库必须可以从 MSVC 和 mingw 代码中使用(更多的兼容性不会受到伤害,但不是绝对必要的)。为了实现这一点,核心功能应该由一个小的、编译器兼容的接口提供,该接口稍后可以被使用客户端代码编译的便利层隐藏。
该库的一个具有挑战性的方面是它必须是可扩展的,以便客户端可以提供自己的缓冲区和流实现,但核心库接口在发布后必须保持稳定。如果您对进一步的背景感兴趣,您可以在论坛主题讨论中阅读它。
我试图了解编译器之间的二进制兼容性问题,但由于我是这个主题的新手,我会对我的结果的评论感兴趣。我对这里的标准定义行为不感兴趣(结构可能无法通过该测试),只对 mingw 和 MSVC 之间的兼容性以及其他编译器之间的兼容性(如果可能的话)感兴趣。
特别是,这些结构是否兼容?它们统一由函数指针组成,所以我认为填充不会成为问题。此外,这里是否需要 stdcall 约定,或者 cdecl 也可以工作?由于两个编译器都默认为 cdecl,我可以不指定它吗?我是不是该?这是我现在所拥有的:
编辑:这个项目已经搁置了一段时间,如果它再次被搁置,可能需要重新考虑。不过我还是把这个问题留了下来,因为我仍然对答案感兴趣。
c++ - 虚拟析构函数导致访问冲突
我正在尝试使 DLL 文件与不同的编译器配置(调试、发布、..)兼容。为了确保以正确的方式删除对象,我设法编写了一个指针包装类,该类在我获取 DLL 的对象并超出范围时使用已编译的删除运算符。
我对此非常满意,但是当我尝试删除在同一方法/程序中分配的内存时,我的程序崩溃了。
以下是在标准发布模式下编译的一些示例代码:
标题
源代码
注意:API 定义为导出/导入。
现在我在调试模式应用程序中使用这个类,我在其中创建一个实例并立即删除它。
在 mlock.c 第 376 行执行删除操作符会导致访问冲突。
这是调用堆栈的副本:
我不能跳到那行或任何东西,但我设法查看了汇编程序代码,这证明了我的观察,它与析构函数有关。
尝试使 DLL 兼容时,虚拟函数/析构函数是否存在一般问题?
visual-c++ - 从 stdcall dll 函数返回结构是否安全?
我正在设计一个至少在 mingw 和 msvc++ 之间必须是二进制兼容的 API。到目前为止,我已经限制自己使用函数来获取和返回原始数据类型或指向具有统一成员的 POD 结构的指针(即成员都是相同的类型,这应该会降低填充不兼容的风险)。
不过,在某些时候按值返回结构会很方便,因此被调用者不需要保留临时副本。所以问题是:当被调用者是由与调用者不同的编译器编译时,按值向/从 stdcall 函数传递结构是否安全?这仍然适用于较新版本的 msvc 和 mingw 吗?我会更有信心,但我发现这个主题讨论了在这种确切情况下使用 cdecl 调用约定的问题,这显然只在 mingw 4.6 中解决。
linux - 二进制文件从一个 linux 到另一个
有没有可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的方法是在另一台机器上重建它,但我们假设我们唯一能得到的是一个二进制文件,那么它可能吗?(我知道这可能并不容易,但我只是好奇)。
scala - Scala 向后兼容性
哪些更改或代码演变破坏了向后兼容性(主要是二进制兼容性)?它在任何地方都完全指定了吗?
我检查了Scala 语言规范,但没有看到任何有关此事的部分,例如Java Language Specification Ch。13 二进制兼容性。