質問

Visual C++ で作成されたライブラリに対して gcc をリンクすることは可能ですか?もしそうなら、そうすることで生じる可能性のある競合や問題はありますか?

役に立ちましたか?

解決

ここでの回答のコメントの中には、少し一般的すぎるものもあります。

いいえ、前述の特定のケースでは、gcc バイナリは VC++ ライブラリとリンクしません (私の知る限り)。コード/ライブラリを相互リンクする実際の手段は、使用されている ABI 標準によって決まります。

組み込みの世界でますます一般的な標準は、EABI (または ARM ABI) 標準です (Itanium 開発中に行われた作業に基づいています) http://www.codesourcery.com/cxx-abi/)。コンパイラが EABI に準拠している場合、相互に連携して動作する実行可能ファイルとライブラリを生成できます。複数のツールチェーンが連携して動作する例としては、GCC ARM ABI バイナリで動作するバイナリを生成する ARM の RVCT コンパイラがあります。

(コードソースのリンクは現在ダウンしていますが、Google キャッシュに保存できます)

他のヒント

そうではないと思います。通常、C++ コンパイラにはまったく異なる名前マングリング方法があり、これはリンカーが正しいシンボルを見つけることができないことを意味します。ちなみに、これは良いことです。なぜなら、C++ コンパイラには、プログラムがクラッシュしたり、停止したり、子犬を食べたり、壁全体にペンキを汚したりするようなレベルの非互換性が標準で許可されているからです。

これを回避するための通常のスキームには、COM や CORBA などの言語に依存しない技術が含まれます。より単純な聖別された方法は、C++ コードの周囲に C「ラッパー」を使用することです。

それは不可能。通常、同じコンパイラの異なるバージョンで生成されたライブラリをリンクすることさえできません。

いいえ。簡潔でシンプル :-)

はい、ダイナミックリンクにしてインターフェースをCスタイルにすれば可能です。lib.exe は、gcc ツールチェーンと互換性のあるインポート ライブラリを生成します。

これでリンクの問題が解決します。しかし、それは問題の始まりにすぎません。

より大きな問題は、例外やメモリ割り当てなどです。

  • VC++ コードから gcc コードに例外が発生しないようにする必要があります。互換性の保証はありません。
  • VC++ ライブラリのすべてのオブジェクトは、次の理由からヒープ上に存在する必要があります。
  • gcc new/delete と VC++ のものを混合しないでください。悪いことが起こります。これはスタック上のオブジェクト構築にも当てはまります。ただし、create_some_obj()/delete_some_obj() のようなインターフェイスを作成すると、VC++ オブジェクトを構築するために gcc new を使用することになります。おそらく、構築と破壊を処理する小さなハンドラー オブジェクトを作成します。この方法では、RAII を保持しますが、実際のインターフェイスとして c インターフェイスを引き続き使用します。
  • 呼び出し規約が正しい必要があります。VC++ には、cdecl と stdcall があります。gcc がインポートされた関数を間違った呼び出しタイプで呼び出そうとすると、悪いことが起こります。

肝心なのは、ANSI C に準拠したシンプルなインターフェイスを維持すれば問題ないはずです。クレイジーな C++ が背後に存在するという事実は、それが含まれている限り問題ありません。

ああ、すべてのコードが再入可能であることを確認してください。そうしないと、まったく別の can-o-worm が開いてしまう危険があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top