Tag: 二进制兼容性

JDK是“向上”还是“向后”兼容?

后向二进制兼容性(或向下兼容性) – 使用旧版本库API构build的客户端在新版本( wiki )上运行的能力。 向上二进制兼容性(或向前兼容性) – 使用新版本库API构build的客户端能够在旧版本( wiki )上运行。 从1.4.2 (以及Java SE 6与J2SE 5.0的兼容性)开始,Sun的关于JDK 5.0中的 JDK 不兼容性的一般文档描述了JDK的兼容性,如下所示: 除了下面列出的不兼容性以外,JDK 5.0与Java 2 SDK v1.4.2是二进制兼容的。 这意味着,除了指出的不兼容性, 使用1.4.2编译器构build的类文件将在JDK 5.0中正确运行 。 我认为文献作者在这句话中混合了 “向上”和“向后”相容的术语。 他们描述了一个“向后”的兼容性,但称这个function为“向上”的兼容性。 这是一个错字,错误还是打算在这里? JDK是“向上”还是“向后”兼容?

在Windows上__cdecl或__stdcall?

我目前正在开发Windows的C ++库,将作为DLL分发。 我的目标是最大化二进制互操作性; 更确切地说,我的DLL中的函数必须可以从多个版本的MSVC ++和MinGW编译的代码中使用,而无需重新编译DLL。 但是,我很困惑哪个调用约定是最好的, cdecl或stdcall 。 有时我会听到像“C调用约定是唯一一个保证与编译器相同的调用约定”这样的语句,这与“ 对cdecl的解释有一些变化,特别是在如何返回值 ”等语句形成对比。 这似乎并不阻止某些库开发人员(如libsndfile )在分发的DLL中使用C调用约定,而没有任何可见的问题。 另一方面, stdcall调用约定似乎是明确的。 据我所知,所有的Windows编译器基本上都需要遵循它,因为它是用于Win32和COM的惯例。 这是基于这样一个假设:没有Win32 / COM支持的Windows编译器不会非常有用。 在论坛上张贴了很多代码片段声明函数为stdcall但我似乎无法find明确解释为什么一个单一的职位。 这里有太多相互矛盾的信息,每次search都会给我不同的答案,这并不能帮助我在两者之间做出决定。 我正在寻找一个清晰的,详细的,辩论的解释,为什么我应该select一个在另一个(或为什么两个是相等的)。 请注意,这个问题不仅适用于“经典”function,而且适用于虚拟成员函数调用,因为大多数客户端代码将通过“接口”,纯虚拟类(以下描述的模式在这里和那里 )与我的DLL接口。

什么导致java.lang.IncompatibleClassChangeError?

我将Java库打包为JAR,当我尝试从中调用方法时,会抛出许多java.lang.IncompatibleClassChangeError 。 这些错误似乎是随机出现的。 什么样的问题可能导致这个错误?