标签: binary-compatibility

是否添加了一个具有实现破坏向后兼容性的特征方法?

在将具有默认实现的方法添加到特征时,我对后向兼容性感到困惑.喜欢:

以前的版本

trait Foo
Run Code Online (Sandbox Code Playgroud)

新版本

trait Foo {
  def verifyConsistency: Option[String] = ??? // provide default implementation
}
Run Code Online (Sandbox Code Playgroud)

迁移管理器报告这除了为二进制不兼容.那是对的吗?

scala binary-compatibility migration-manager

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

Haskell二进制兼容性

假设我编写了一些Haskell代码并在Ubuntu 64位安装中编译它,静态链接所有Haskell软件包和c库.结果是否与任何其他64位Linux发行版二进制兼容?

haskell static-linking binary-compatibility

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

交叉编译器C中的二进制兼容性

我需要验证一些我怀疑的东西.如果共享库(.dll)是用C语言编写的,则使用C99标准并在编译器下编译.说MinGw.然后根据我的经验,它是二进制兼容的,因此可以从任何其他编译器使用.说MS Visual Studio.我根据自己的经验说,因为我不止一次成功地尝试过它.但我需要验证这是否是一个规则.

另外我想问一下它是否确实如此,那么为什么完全用C语言编写的库,例如openCV,不为每个不同的操作系统提供编译的二进制文件?我知道明显的原因是设置所有的编译时参数,但除此之外没有正确的吗?

编辑:我正在添加一个额外的问题,我认为这是原始的逻辑扩展.这不是一个如何去创建一个封闭的源库吗?由于提供源的选项不在窗口中,因此给出二进制文件是唯一的选择.在这种情况下,为尽可能多的体系结构提供二进制文件是理想的结果,C是在系统和编译器之间具有最佳可移植性的明显选择.对?

c shared-libraries binary-compatibility

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

有条件地链接@autoreleasepool

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

dyld: lazy symbol binding failed: Symbol not found: _objc_autoreleasePoolPush
Run Code Online (Sandbox Code Playgroud)

我环顾四周,看到解决方法是添加libarclite_iphoneos.a.这也是模拟器的一个版本,如libarclite_iphonesimulator.a.

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

例如,为模拟器构建:

ld: warning: ignoring file /Developer-4.2/Platforms/iPhoneOS.platform/
Developer/usr/lib/arc/libarclite_iphoneos.a, missing required architecture
i386 in file
Run Code Online (Sandbox Code Playgroud)

我如何同时修复这两个?或者我NSAutoreleasePool现在应该坚持使用旧语法?

cocoa-touch binary-compatibility ios4 ios5

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

添加移动构造函数是否会破坏二进制兼容性?

如果我将移动构造函数(或移动赋值运算符)添加到我的库中,我是否会破坏二进制兼容性?这种添加能否以任何方式破坏用户的代码?

class Foo {
public:
  Foo();
  Foo(Foo const&);
  Foo& operator=(Foo const&);

// new methods:
  Foo(Foo&&);
  Foo& operator=(Foo&&);
};
Run Code Online (Sandbox Code Playgroud)

c++ move binary-compatibility c++11

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

编译器之间的DLL兼容性

有没有办法让不同编译器构建的c ++ dll相互兼容?这些类可以有工厂方法来创建和销毁,因此每个编译器都可以使用自己的new/delete(因为不同的运行时有自己的堆).

我尝试了以下代码,但它崩溃了第一个成员方法:

interface.h

#pragma once

class IRefCounted
{
public:
    virtual ~IRefCounted(){}
    virtual void AddRef()=0;
    virtual void Release()=0;
};
class IClass : public IRefCounted
{
public:
    virtual ~IClass(){}
    virtual void PrintSomething()=0;
};
Run Code Online (Sandbox Code Playgroud)

test.cpp用VC9编译,test.exe

#include "interface.h"

#include <iostream>
#include <windows.h>

int main()
{
    HMODULE dll;
    IClass* (*method)(void);
    IClass *dllclass;

    std::cout << "Loading a.dll\n";
    dll = LoadLibraryW(L"a.dll");
    method = (IClass* (*)(void))GetProcAddress(dll, "CreateClass");
    dllclass = method();//works
    dllclass->PrintSomething();//crash: Access violation writing location 0x00000004
    dllclass->Release();
    FreeLibrary(dll);

    std::cout << "Done, press enter to exit." << …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction dll binary-compatibility

9
推荐指数
4
解决办法
7266
查看次数

Java中重构的方法和二进制兼容性

在重构方法时,很容易在Java中引入二进制不可编码(使用以前版本的代码).

考虑更改方法以将其参数的类型扩展为父接口:

 void doSomething(String x);

 // change it to

 void doSomething(CharSequence c);
Run Code Online (Sandbox Code Playgroud)

使用此方法的所有代码将继续编译而不进行更改,但它确实需要重新编译(因为旧的二进制文件将因MethodNotFoundError而失败).

如何将方法拉入父类.这需要重新编译吗?

// before
public class B extends A{
    protected void x(){};
}

// after
public class A {
    public void x(){};
}
public class B extends A{}
Run Code Online (Sandbox Code Playgroud)

该方法已从B移至父A.它还将可见性从受保护更改为公共(但这不是问题).

我是否需要在B中维护"二进制兼容性包装器",还是继续工作(自动调度到父类)?

 // do I need this ?
 public class B extends A{
     // binary compatibility wrapper
     public void x(){ super.x(); }
 }
Run Code Online (Sandbox Code Playgroud)

java refactoring binary-compatibility

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

更改类私有数据成员的顺序是否会破坏ABI

我有一个包含多个私有数据成员的类(其中一些是静态的),由虚拟和非虚拟成员函数访问.没有内联函数,也没有朋友类.

class A
{
    int number;
    string str;
    static const int static_const_number;
    bool b;
public:
    A();
    virtual ~A();
public:
    // got virtual and non-virtual functions, working with these memebers
    virtual void func1();
    void func2();

    // no inline functions or friends
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,更改私有数据成员的顺序是否会破坏ABI?

class A
{
    string str;
    static const int static_const_number;
    int number; // <--   integer member moved here
    bool b;
    ...
};
Run Code Online (Sandbox Code Playgroud)


编辑
类型不会更改,只会更改成员的顺序.也没有使用位标志.代码用作共享库,没有静态链接到此代码.我在Linux上,编译器是gcc-3.4.3和gcc-4.1

c++ linux gcc shared-libraries binary-compatibility

9
推荐指数
2
解决办法
633
查看次数

默认构造函数和析构函数是否内联?

我很好奇编译器生成的默认构造函数和析构函数是否内联,因为我可以证明它是正确的.一方面,您希望默认构造函数/析构函数不是内联的,以便稍后添加它们不会破坏ABI(因为只有默认值时编译的目标文件才会内联生成的定义而不是您定义的定义).另一方面,对于C++编译器来编译与使用C编译器编译时相同的C代码,它不能为每个分配的结构添加构造函数/析构函数调用,而在C++中,类的唯一功能区别是并且结构应该是默认的访问保护.也许链接器以某种方式解决这个问题 也许答案因编译器而异?

这个问题的结果是:如果我在C++中有一个POD结构,理论上我可以通过自己定义空内联构造函数/析构函数代替默认值来获益吗?

c c++ inline abi binary-compatibility

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

番石榴二进制版与以前的版本兼容吗?

Guava README说@Beta或者已经弃用了可以更改,删除等等.它没有说清楚所有剩余的类是否与以前的版本二进制兼容(或者我误读了它).虽然我没有另外说明,但我觉得它是向后兼容的.

我担心的是,其他一些库可能会对新的番石榴版本起作用(并编译).但它也可能依赖于新版本可能已更改/修复的一些错误行为,这些行为无法轻易检测到.我可以安全升级吗?

java backwards-compatibility binary-compatibility guava

9
推荐指数
2
解决办法
1837
查看次数