Visual C++ で作成されたライブラリに対して gcc をリンクすることは可能ですか? もしそうなら、そうすることから生じる可能性のある衝突/問題はありますか?
5 に答える
ここでの回答のコメントのいくつかは、少し一般的すぎます。
いいえ、特定のケースでは、gccバイナリはVC ++ライブラリ(AFAIK)とリンクしません。コード/ライブラリを相互リンクする実際の手段は、使用されているABI標準の問題です。
組み込みの世界でますます一般的になっている標準は、EABI(またはARM ABI)標準です(Itanium開発中に行われた作業に基づくhttp://www.codesourcery.com/cxx-abi/)。コンパイラがEABIに準拠している場合、コンパイラは相互に動作する実行可能ファイルとライブラリを生成できます。一緒に動作する複数のツールチェーンの例は、GCCARMABIバイナリで動作するバイナリを生成するARMのRVCTコンパイラです。
(コードソースリンクは現在ダウンしていますが、グーグルキャッシュすることができます)
それは不可能。通常、同じコンパイラの異なるバージョンで作成されたライブラリをリンクすることさえできません。
いいえ。わかりやすくシンプルです:-)
はい、動的リンクにしてインターフェイスを c スタイルにすれば。lib.exe は、gcc ツールチェーンと互換性のあるインポート ライブラリを生成します。
これにより、リンクの問題が解決されます。しかし、それは問題の始まりに過ぎません。
より大きな問題は、例外やメモリ割り当てなどです。
- 例外が VC++ から gcc コードに渡らないようにする必要があります。互換性の保証はありません。
- 次の理由により、VC++ ライブラリのすべてのオブジェクトはヒープ上に存在する必要があります。
- gcc new/delete を VC++ のものと混ぜないでください。悪いことが起こります。これは、スタック上のオブジェクト構築にも当てはまります。ただし、create_some_obj()/delete_some_obj() のようなインターフェイスを作成すると、gcc new を使用して VC++ オブジェクトを構築することにはなりません。おそらく、構築と破壊を処理する小さなハンドラー オブジェクトを作成します。このようにして RAII を維持しながら、真のインターフェースとして c-interface を使用します。
- 呼び出し規約が正しい必要があります。VC++ には cdecl と stdcall があります。gcc がインポートされた関数を間違った呼び出しタイプで呼び出そうとすると、悪いことが起こります。
肝心なのは、ANSI C に準拠したシンプルなインターフェイスを維持することです。問題はありません。クレイジーな C++ が後ろに続くという事実は、それが含まれている限り問題ありません。
ああ、すべてのコードが再入可能であることを確認してください。そうしないと、別の can-o-worms を開くリスクがあります。
私はそうではないと思います。通常、C++ コンパイラにはまったく異なる名前マングリングの方法があります。これは、リンカーが正しいシンボルを見つけられないことを意味します。ちなみに、これは良いことです.C++コンパイラは、プログラムがクラッシュしたり、死んだり、子犬を食べたり、壁全体にペンキを塗ったりするよりもはるかに大きなレベルの非互換性を持つことが標準で許可されているためです.
これを回避するための通常のスキームには、通常、COM や CORBA などの言語に依存しない手法が含まれます。より単純で神聖な方法は、C++ コードの周りに C の「ラッパー」を使用することです。