問題タブ [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.
c++ - インターフェイス (抽象クラス) と他の仮想変更との ABI 互換性
仮想を含む他の変更が派生クラスで行われた場合でも、クラスのビューの ABI は安定したままですか?
つまり、インターフェイスInterfaceA
(多くの純粋仮想関数を持つ抽象クラス) とDerivedB
それを継承するクラスがあるとします。を取る関数を持つライブラリを作成しますInterfaceA *
。私が知りたいのは、インターフェイス自体が変更されない限り、インターフェイスがバイナリ互換性を維持しているかどうかです。
明らかに、変更した場合InterfaceA
、コードがバイナリ互換であることは期待できません。ただし、単に変更するとどうなるでしょうかDerivedB
。つまり、さらにインターフェイスを継承したり、他の仮想関数を追加したりします。極端な言い方をすると、 を定義する別のクラスから多重継承しますInterfaceA
。InterfaceA
これらすべての変更にもかかわらず、バイナリ互換性は維持されますか?
今までの私の仮定と経験は、互換性があるということです。これの確認(または互換性がない場合は反論)を探しているだけです。
注: 動的型付けやその他のキャストについては気にしません。インターフェイス関数自体についてのみ気にします。
また、注意: 使用されているコンパイラのバージョンは、全体として ABI が安定していると想定してください。メジャー バージョンの変更はありません。
java - javaRuntimeの自作のパブリックAPIの互換性について
変更されたAPIに関する実際の問題が発生しました。そして、私はこのトピックについてもっと知りたいです。次の例をデモとして使用します。
4つの単純なクラスがあり、ChildクラスはParentを拡張します。PubAPIは、cientで使用するためのパブリックメソッドを提供するクラスです。クライアントクラスは、PubAPIのパブリックメソッドを呼び出します。
最初の3つのクラスはAPIメーカーによって提供され、上記のバージョンがバージョン1であるとします。
バージョン2では、PubAPIクラスが変更されて子タイプを返します。
3 APIプロバイダークラスは現在バージョン2にありますが、「Client」クラスを再コンパイルせず、バージョン1で生成されたクラスファイルを使用する場合。ITはJavaランタイムで失敗し、バージョン1のメソッドが見つからないというエラーが発生します(リターンタイプが変更されたため)。
私はこれまで知りませんでした。たとえば、パブリックAPIがスローを追加したり、同期を追加したり、クラスが最終的になったりするなど、誰かがこのトピックについてもっと知っているかどうかを知りたいです。このような状況では、どのようになりますかそれはhehave。
全体として、他の人が使用するAPIクラスのパブリックAPI/クラスバイトコードレベルの互換性ルールは何ですか。
ありがとう。
cocoa-touch - @autoreleasepool の条件付きリンク
iOS 4.3 シミュレーター (Xcode 4.2) でアプリケーションを実行しようとすると、@autoreleasepool{} を押すと次のようにクラッシュします。
周りを見回したところ、回避策は追加することであることがわかりましたlibarclite_iphoneos.a
。として、シミュレータ用のバージョンもありますlibarclite_iphonesimulator.a
。
シミュレーターとハードウェアの両方で実行するには、プロジェクトに両方のライブラリを追加する必要があります。しかし、どちらを構築しても、他のライブラリはサポートされていないアーキテクチャ用であると不平を言っています。
たとえば、シミュレーター用のビルド:
これらの両方を同時に修正するにはどうすればよいですか? それともNSAutoreleasePool
、今のところ古い構文に固執する必要がありますか?
c# - プロパティが追加されたときに .NET アセンブリの COM バイナリ互換性を維持するにはどうすればよいですか?
言語翻訳情報を格納する .NET アセンブリを開発しました。VB6 アプリケーションで使用する必要があります。
アプリケーションを再コンパイルせずに翻訳情報を変更できるようにしたいと考えています。
翻訳は、LanguageServices と呼ばれる 2 つのファイルの部分クラスによって提供されます。
1 つのファイルは不変のライブラリ メソッドで、もう 1 つはすべて resx ファイルから自動生成されたプロパティであり、regx は言語翻訳情報のデータベースから生成されます。
これはすべて、異なるアプリケーションのそれぞれで使用できる形式にプログラムで「フラット化」できる翻訳の中央データベースを持つ必要性から生じました。
これで、この問題をバイパスして別の方法で解決できます。実際、自動生成されたプロパティのリストを取り除くだけで、問題は解決します。
私が興味を持っているのは、この問題をどのように解決できるかということです。
新しい翻訳ラベルをデータベースに追加すると (THIS WORD 内の THIS WORD が THAT WORD になります)、新しいプロパティがクラスに追加され、新しい公開プロパティが COM インターフェイスに追加されます。
プロパティは COM インターフェイスの途中に追加されるため、バイナリ互換性が失われます。C# コンパイラが部分クラスの動的部分に部分クラスの静的部分を接尾辞として追加するため、それらは途中で追加されます。私がする必要があるのは、それらを逆に連結するか、C# ファイル自体で順序を明示的に指定することです。クラスの静的部分に DispID を明示的に設定すればできると思っていましたが、そうではありませんでした。
ビルド プロセスによって生成される IDL ファイルのペアを次に示します。
新しいプロパティを追加する前の IDL は次のとおりです。
新しいプロパティが追加され、互換性が失われた後の IDL は次のとおりです。
正確な違いは、このビットが真ん中に押し込まれていることです:
それが問題だと思います。メソッドの順序を変更することです。DispID を明示的に定義することで、順序をオーバーライドできると思いました (HRESULT Culture([in] ICultureInfo* pRetVal);
以降のすべての ID が 0 から始まることがわかります。
作成/生成された C# コードは次のとおりです。 ILanguageServices.cs: 自動生成されたインターフェイス。
ILanguageServices_Static.cs: インターフェイスの不変部分
考えてみれば、部分クラスじゃなくてもいいんじゃないかな。自動生成された部分を生成した xslt を変更して、静的部分を含めるだけです。別々に保管するのはちょうどよかったです。
いずれにせよ、それが機能しない理由と、COM インターフェイスをより厳密に制御する方法を誰か教えてもらえますか? メソッドを厳密に順序付けすることは、とても... ひどいようです。
ありがとう、
J1M.
c++ - Windows での C ライブラリのバイナリ クロス コンパイラ互換性
私の質問はthis oneに似ていますが、静的ライブラリに関しても:
複数のコンパイラと 32 ビットと 64 ビットの両方で動作する、Windows/Linux/Os X で適切にビルドされるクロスプラットフォームの C++ ヘッダー ライブラリがあります。ユーザーが zlib または libbz2 をインストールしている場合、ビルド システムは を介してライブラリの一部の機能を有効にします#ifdefs
。
ユーザーが簡単にインストールできるように、Windows 用の zlib や libbz2 などのライブラリを、バイナリ形式または数回クリックしてインストールできるソースとして出荷したいと考えています。(Linux および Mac Os X では、システム パッケージが実際にほとんどの標準的なインストールで利用できるため、ライブラリを簡単にインストールできます。私が知る限り)。
最終的な解決策では、ユーザーが Visual C/C++ コンパイラ 2005、2008、および 2010 と MinGW を 32 ビットおよび 64 ビット Windows で使用して、zlib および libbz2 に簡単にリンクできるようにする必要があります。現時点および近い将来の C ライブラリのみに関心があります。
ライブラリは個別にビルドする必要があります。それらのビルドをビルド システムに統合したくありません。
私が見る限り、ここには少なくとも 2 つの自由度があります。
- 静的ライブラリまたは DLL を使用するかどうか。
- バイナリ ライブラリを出荷するか、ユーザーが独自のライブラリを構築できるようにするか。
もう 1 つのポイントは、ユーザーが自分のプログラムのデバッグ バージョンと最適化バージョンの両方に対してライブラリをリンクできる必要があるということです。私は Windows プログラミングの専門家ではありませんが、インターネットや職場の他の開発者から調べた限りでは、Windows のデバッグ ビルドとリリース ビルドにはこの (異常な?) 違いがあります。どうやら、デバッグ プログラムをリリース ライブラリに対してリンクしたり、その逆をリンクしたりすることはできません。これは正しいです?
(1) C++ コンパイラの依存 C ライブラリを出荷する最良の方法は何ですか? (2) 後で C++ ライブラリも出荷したい場合、ユーザーが各コンパイラでソースからビルドできるようにすることが唯一の実行可能な方法ですよね?
unix - バイナリをビルドして Unix の複数のマシンで使用する方法は?
私は次のように構築しているコンパイラのソースコードを持っています:
結果として得られる「installdir」を他のマシンに配布したいと考えています。これは、3 段階のビルド プロセスを経ることなく、誰でもコンパイラ バイナリを使用できるようにするためです (配布 tarball に installdir を含めているだけです)。
テストのために、インストールディレクトリを別のユーザーの別のマシンにコピーし、次のように、コピーしたばかりのバイナリを使用してテストプログラムをコンパイルしようとしています:
次に、次のようなエラーが表示されます。
これは、ビルド マシンで/home/sghosh/normalbuild/install
指定されているものです--prefix
。バイナリはinstalldir の下のディレクトリにいくつかのファイルを必要としますが、それは に記載されているパスでconfigure
あるため、まだそこを探しているので、現在のマシンの同じディレクトリを調べたいと思っています。参考までに、私は sudo/root 権限を持っていません。installdir/bin/ucc
open64-gcc-4.2.0
--prefix
--prefix
この場合、初期パスを調べずに、どのマシンでも動作する (一度ビルドすると、どこでもソートを使用する) バイナリ ディストリビューションを作成するにはどうすればよいでしょうか?
スーパーユーザーで同様の質問がありましたが、多くの編集が行われ、新しい質問への回答が得られなかったため、ここに書きます。
c++ - クラス内に列挙型定義を追加すると、バイナリ後方互換性が失われますか?
static
メンバー関数を追加することは問題ないことはわかっていますが、enum
定義についてはどうでしょうか。新しいデータ メンバーはありません。定義だけです。
少し背景:
文字列表現によってアドレスstatic
のバージョン (関数) を認識するメンバー関数を (クラスに)追加する必要があります。IP
最初に頭に浮かぶのは、enum
forを宣言しIPv4
、これを関数の戻りコードにすることです。 IPv6
Unknown
enum
しかし、バイナリの下位互換性を壊したくありません。
そして、本当に悪い質問 (SO の場合) - ソースや質問はありますか? それについてもっと読むことができますか? つまり、バイナリ互換性を損なうものとそうでないものがあります。それとも、多くのもの (アーキテクチャ、OS、コンパイラなど) に依存しますか?
編集: @PeteKirkham のコメントについて:それでは、少なくとも - 変更されたABIをテスト/チェックする方法はありますか、それについて新しい質問を投稿する方が良いですか?
EDIT2 : SO Question : C++ で ABI ブレークを検出するための静的分析ツールを 見つけました。私はそれが何らかの形でここに関連していると思い、バイナリ互換性をチェックするツールに関する部分に答えます。それが私がここにそれを関連付ける理由です。
vb6 - vb6 バイナリ互換性の回避
これは、多かれ少なかれ、このプロセスをよりよく理解するのに役立つ学問的な質問です...バイナリ互換性を回避する方法を理解するための要求ではないので、これを試してはいけない理由を説明する必要はありません:)
パブリック メンバーを持たない vb6 で dll を作成してコンパイルするとします。実際には、少なくとも 1 つがないとコンパイルできない可能性があると思います。つまり、1 つのパブリック メソッドを作成するとします。ただし、それは dll がコンパイルされるようにするためだけのものであり、それ以外の場合は無視します。
ここで、プロジェクトの互換性をこの dll に設定するとします。どのような状況でも、この dll を更新したり、互換性を更新されたバージョンの dll に変更したりすることは決してありません。
このシナリオでは、vb6 がこれらの互換性を破るエラー メッセージをスローすることはなく、実際に互換性を破った場合でも、コンパイルごとに dll に同じ UUID を使用し続けると考えています。
ただし、そのdllで作成するクラスに対して生成される値は、毎回変わると思います。また、その dll をコンパイルするための互換性の問題は発生しませんが、最終的には、この dll を参照するプロジェクトの互換性の問題が発生します。
それは正しいと思いますか?
c++ - STLコンテナとバイナリインターフェイスの互換性
STLバイナリインターフェイス
C++用の複数のコンパイラとプラットフォーム間でSTLオブジェクトの互換性のあるインターフェイスレイヤーに取り組んでいる人がいるかどうか知りたいです。
目標は、STLタイプをファーストクラスまたは組み込みのデータ型としてサポートすることです。
これを防ぐ一般的なテンプレートによって課せられる固有の設計上の制限はありますか?これは、バイナリ配布にSTLを使用する際の主な制限のようです。
理論-おそらく答えは実用的です
Microsoftは.NETに力を入れており、C++STLサポートが「ファーストクラス」であることをあまり気にしていません。
オープンソースは、バイナリのみの配布を促進することを望んでおらず、10の異なるバージョンの不一致ではなく、単一のコンパイラで問題を解決することに重点を置いています。
これは、Qtや他のライブラリでの私の経験によってサポートされているようです。これらは通常、使用する環境のビルドを提供します。たとえば、Qt4.6およびVS2008。
参照:
c++ - VS2005でビルドされたバイナリで使用されるVS2008でビルドされた.lib
Visual Studio 2005でコンパイルしたプログラムで、Visual Studio 2008で構築されたサードパーティの.libとリンクできないのはなぜですか?ありがとう