1

最近ここで得た回答 (3 つ目) について詳しくお聞きしたいと思います: Compiled languages basics

C と MinGW で記述し、VC によってコンパイルされた C++ ライブラリにリンクすると、動作しますか? どうすれば事前に知ることができますか?

つまり、その C++ .dll にリンクする .exe を警告なしで作成でき、その .exe を実行 (実行するだけで、それ以上のテストは不要) できる場合、それは機能したことを意味しますか? ある時点でコアダンプしませんか?

確かに、ライブラリ ソースを自分で再コンパイルし、それをリンクする必要がありますか?

C++ と C コードをリンクすると問題が発生する可能性があることは理解していますが、それがいつ機能し、いつ機能したかを知るにはどうすればよいですか?

PS:はい、 コンパイルされたライブラリを使用するのを見ました... 私の質問は少し違うと思いました。

4

2 に答える 2

5

はい、再コンパイルせずに MinGW 用に MSVC コンパイル済みライブラリを変換できます。
いくつかのツールと dll だけが必要です。こちらをご覧ください

C と C++ の混在について - バイナリのサイズを気にしない場合は、c プロジェクトに c++ コンパイラを使用してください。このようにして、リンク先のライブラリで発生する可能性のある問題について心配する必要はありません。

于 2009-09-14T08:53:04.867 に答える
1

CとMinGWで記述し、VCによってコンパイルされたC ++ライブラリにリンクすると、機能しますか?

それはコンパイラー(そして私はMinGWを知りません)と特定のC++ライブラリーに依存します。

リンクしない、またはリンクするとクラッシュする可能性がある理由:

  1. C++ライブラリは「マングル」名を使用してC++クラスとメソッドをエクスポートしていますが、MinGWのC ++名前マングリングはVCのものとは異なる場合があります(C ++ではなくCでコーディングしている場合は存在しません)。

  2. VCコードはMinGWと同じCランタイムライブラリを使用しません。これは、APIがVCコードによってヒープにメモリが割り当てられ、MinGWコードによって解放されることになっている場合に問題になります。

  3. VCのコードはMinGWのコードとバイナリ互換ではありません(同じパラメーター受け渡し規則を使用せず、同じ方法で例外を実装しません)

一方、それが機能する可能性があるいくつかの理由:

  1. C ++ライブラリは、別のコンパイラから呼び出されることを意図した開発者によって、Cスタイルのインターフェイスで記述されています。

  2. 1と同じ。

  3. MinGWコンパイラのメーカーは、VCとのバイナリ互換性を実現しました

どうすれば事前に知ることができますか?

知らない。DLLからエクスポートされた関数の名前、および/またはそのパブリック/エクスポートされたAPIを宣言するヘッダーファイルを投稿すると、C ++をエクスポートしているかどうか(おそらく互換性がない)についての非常に強力なヒントが得られます-スタイルのメソッドまたはエクスポート(より互換性が高い)Cスタイルの関数。

それ以外の場合は、2段階の質問があります。

  1. MinGWコードがVCコードを呼び出すには、何が必要ですか(たとえば、C ++の代わりにC、たとえば、同じヒープを使用すると想定しない、たとえば、パラメーターの受け渡し規則を指定する)。

  2. あなたのVCライブラリはそれを念頭に置いて書かれていますか?

両方のコンパイラを使用したことがある人は、おそらく最初の質問に答えることができます(私はMinGWを使用していません)。誰が2番目に答えられるかわかりません。そのVCライブラリを書いたのは誰ですか?

于 2009-09-14T12:11:59.677 に答える