标签: binary-compatibility

更改构造函数param类型会破坏另一个jar中的类

我在一个普通的jar中有以下类:

public class Common 
{
  public Common(List list)
  {
    ...  
  }  
}
Run Code Online (Sandbox Code Playgroud)

然后我将构造函数参数从a更改List为a Collection,如下所示:

public class Common 
{
  public Common(Collection collection)
  {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

重建公共jar并运行系统会NoSuchMethodError在调用构造函数时导致任何依赖类,直到我重新编译该类.

我有一些想法是什么导致这一点,沿着构造函数如何绑定在依赖类的字节码中,但我不是100%肯定.

请问有人可以了解这里发生的事情吗?

更新

我随后做了一个快速测试并看了一下字节码:

Compiled from "Client.java"
public class Client extends java.lang.Object{
public Client();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   new #2; //class ArrayList
   3:   dup
   4:   invokespecial   #3; //Method java/util/ArrayList."<init>":()V
   7:   astore_1
   8:   new #4; //class Common
   11: …
Run Code Online (Sandbox Code Playgroud)

java parameters binding constructor binary-compatibility

3
推荐指数
1
解决办法
603
查看次数

删除接口会破坏代码调用对象的方法吗?

我需要在Java中进行一些重构,我需要保持一定程度的二进制兼容性.在这种情况下,我想删除一些遗留接口,这些接口不再在任何地方使用,并且需要相当大的(也是已弃用的)外部依赖项.

我有C实现接口的类,I我有一个代码调用一个实例的方法(在接口中声明)C.调用代码知道它正在使用C,而不仅仅是接口.

 class C implements I {
      void theMethod(){} ; // is declared in the interface I
 }

 C object;
 object.theMethod();
Run Code Online (Sandbox Code Playgroud)

当我从类定义中删除接口(但保留所有方法)时,调用代码(根本不涉及接口)是否仍然有效(没有重新编译)?

java refactoring binary-compatibility

2
推荐指数
1
解决办法
123
查看次数

是否有可能在.NET库中实现二进制兼容性?

我在COM中可以看到.NET库,它是从vb6应用程序调用的.

如果我添加一些方法并发布新版本(但不要删除或更改现有方法的签名),我希望能够将它安装在生产机器中,并使其正常工作.但是,似乎这种方法不起作用; 我需要重新编译vb6应用程序.

有没有办法实现这个目标?

.net vb6 interop binary-compatibility

2
推荐指数
1
解决办法
366
查看次数

VS2017和VS2015之间的二进制兼容性

这个帖子: Visual-C++ - 2017二进制兼容VC++ - 2015?清楚地说,VS 2017与VS 2015是二进制兼容的.它甚至看起来像官方立场.

我的问题是,在过去,我清楚地记得每当我尝试将使用不同版本的MSVC编译的静态库链接到EXE中时,遇到链接器错误(我不记得具体的错误集)使用较新版本的MSVC构建.

然而,二进制(in)兼容性听起来像是在运行时会在你脸上爆炸的东西,而不是链接时间.

有人能告诉我,以前版本的MSVC是否确实生成了版本不匹配的链接器错误?这是如何完成的?

编辑

这如何影响打开WPO/LTCG时构建的静态库?我相信这些产生了中间目标文件(而不是COFF),并且Microsoft不保证这些中间文件的格式在不同版本的编译器中保持停滞.

abi binary-compatibility visual-c++-2015 visual-c++-2017

2
推荐指数
1
解决办法
1712
查看次数

如何定位Debian稳定但在测试中发展?

我们有一些专门开发的C++应用程序,仅适用于Debian stable(x86).

目前,这些应用程序的开发也是使用Debian stable(x86)系统完成的,因此开发人员拥有与目标系统相同的库版本.
偶尔,我还需要处理这些组件,并且一直困扰我,因为我坚持使用非常过时的KDevelop版本(4.0.1与最新的4.4.1).我想使用更新的系统进行开发(比如最新的Ubuntu或Debian测试),但是如何创建适合目标系统的二进制文件呢?
是否有一些简单的方法可以告诉编译器/链接器只使用目标平台上可用的库版本?
我看了Emdebian和他们的交叉编译包,但我不认为这对我有用.他们似乎只有针对ARM等其他架构的软件包.

linux debian chroot cross-compiling binary-compatibility

1
推荐指数
1
解决办法
441
查看次数

C++中的部分类

我想避免重新编译包含公共头文件的所有内容,只是因为在类定义的私有部分中发生了某些变化.我正在调查PIMPL旁边的其他选项.

这是我试过的:

我创建了一个包含A类的库:

A_p.h包含A类的私有部分

void PrivateMethod(int i);
Run Code Online (Sandbox Code Playgroud)

公共头文件:

class A
{
public:
    A();
    virtual ~A();
    // other public members
private:
#ifdef A_PRIVATE
#include "A_p.h"
#endif
};
Run Code Online (Sandbox Code Playgroud)

A.cpp

#define A_PRIVATE
#include "A.h"

A::A() {}
A::~A() {}
void A::PrivateMethod(int i) { }
Run Code Online (Sandbox Code Playgroud)

然后,我创建了一个Win32控制台项目,其中包含公共标头(Ah)和针对.lib文件的链接.

一切似乎都有效,但我想知道沿途的任何陷阱.任何人都可以详细说明这个吗?

c++ partial-classes binary-compatibility

1
推荐指数
1
解决办法
2402
查看次数

std :: unique_ptr ABI与原始指针兼容吗?

我的阅读std::unique_ptr使我确信它(以及其他智能指针)绝对是项目内部指针的最佳选择(特别是在优化编译器可以从std :: unique_ptr中删除所有运行时成本之后?),但我是还不确定在界面上做什么.我不完全了解各种C++ ABI是如何工作的,所以如果这是一个愚蠢的问题请耐心等待,但是可以使用或返回指针,具有指针成员的类/结构等的函数被替换为使用的东西unique_ptr(也许使用unique_ptrrefs?)而不需要重新编译?C代码可以在unique_ptr没有复杂的情况下与C++接口交互吗?

c++ abi unique-ptr binary-compatibility c++11

1
推荐指数
1
解决办法
521
查看次数