我在一个普通的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中进行一些重构,我需要保持一定程度的二进制兼容性.在这种情况下,我想删除一些遗留接口,这些接口不再在任何地方使用,并且需要相当大的(也是已弃用的)外部依赖项.
我有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)
当我从类定义中删除接口(但保留所有方法)时,调用代码(根本不涉及接口)是否仍然有效(没有重新编译)?
我在COM中可以看到.NET库,它是从vb6应用程序调用的.
如果我添加一些方法并发布新版本(但不要删除或更改现有方法的签名),我希望能够将它安装在生产机器中,并使其正常工作.但是,似乎这种方法不起作用; 我需要重新编译vb6应用程序.
有没有办法实现这个目标?
这个帖子: Visual-C++ - 2017二进制兼容VC++ - 2015?清楚地说,VS 2017与VS 2015是二进制兼容的.它甚至看起来像官方立场.
我的问题是,在过去,我清楚地记得每当我尝试将使用不同版本的MSVC编译的静态库链接到EXE中时,遇到链接器错误(我不记得具体的错误集)使用较新版本的MSVC构建.
然而,二进制(in)兼容性听起来像是在运行时会在你脸上爆炸的东西,而不是链接时间.
有人能告诉我,以前版本的MSVC是否确实生成了版本不匹配的链接器错误?这是如何完成的?
这如何影响打开WPO/LTCG时构建的静态库?我相信这些产生了中间目标文件(而不是COFF),并且Microsoft不保证这些中间文件的格式在不同版本的编译器中保持停滞.
我们有一些专门开发的C++应用程序,仅适用于Debian stable(x86).
目前,这些应用程序的开发也是使用Debian stable(x86)系统完成的,因此开发人员拥有与目标系统相同的库版本.
偶尔,我还需要处理这些组件,并且一直困扰我,因为我坚持使用非常过时的KDevelop版本(4.0.1与最新的4.4.1).我想使用更新的系统进行开发(比如最新的Ubuntu或Debian测试),但是如何创建适合目标系统的二进制文件呢?
是否有一些简单的方法可以告诉编译器/链接器只使用目标平台上可用的库版本?
我看了Emdebian和他们的交叉编译包,但我不认为这对我有用.他们似乎只有针对ARM等其他架构的软件包.
我想避免重新编译包含公共头文件的所有内容,只是因为在类定义的私有部分中发生了某些变化.我正在调查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文件的链接.
一切似乎都有效,但我想知道沿途的任何陷阱.任何人都可以详细说明这个吗?
我的阅读std::unique_ptr使我确信它(以及其他智能指针)绝对是项目内部指针的最佳选择(特别是在优化编译器可以从std :: unique_ptr中删除所有运行时成本之后?),但我是还不确定在界面上做什么.我不完全了解各种C++ ABI是如何工作的,所以如果这是一个愚蠢的问题请耐心等待,但是可以使用或返回指针,具有指针成员的类/结构等的函数被替换为使用的东西unique_ptr(也许使用unique_ptrrefs?)而不需要重新编译?C代码可以在unique_ptr没有复杂的情况下与C++接口交互吗?
abi ×2
c++ ×2
java ×2
.net ×1
binding ×1
c++11 ×1
chroot ×1
constructor ×1
debian ×1
interop ×1
linux ×1
parameters ×1
refactoring ×1
unique-ptr ×1
vb6 ×1