さまざまなコンパイラによってコンパイルされたリンクライブラリ
-
07-07-2019 - |
質問
最近ここで得た回答(3番目の回答)について詳しくお聞きします。 コンパイルされた言語の基本
CとMinGWで記述し、VCによってコンパイルされたC ++ライブラリにリンクする場合、動作しますか?事前に知る方法
つまり、そのC ++ .dllにリンクする.exeを警告なしに作成でき、その.exeを実行できる(実行するだけで、それ以上のテストは行わない)場合、それは意味します働いた?ある時点でコアダンプしませんか?
完全に確実にするために、自分でライブラリソースとそれとのリンクを再コンパイルする必要がありますか?
C ++とCコードのリンクに時々問題があるかもしれないことを理解していますが、それがいつ機能し動作したかを知る方法は?
PS:はい、見ました コンパイルされたライブラリを使用... 私の質問は少し違うと思いました。
解決
CおよびMinGWで記述し、VCによってコンパイルされたC ++ライブラリにリンクする場合-動作しますか?
コンパイラ(およびMinGWを知らない)および特定のC ++ライブラリに依存します。
リンクしない理由、またはリンクした場合にクラッシュする理由:
-
C ++ライブラリは、" mangled"を使用して、C ++クラスとメソッドをエクスポートしています。名前ですが、MinGWのC ++名前マングリングはVCのものとは異なるかもしれません(私は知りません)(そしてC ++ではなくCでコーディングしている場合は存在しません)
-
VCコードはMinGWと同じCランタイムライブラリを使用しません。これは、メモリがVCコードによってヒープに割り当てられ、メモリによって解放されることになっているAPIの場合に噛みつきますMinGWコード。
-
VCのコードはMinGWのコードとバイナリ互換ではありません(同じパラメーター渡し規則を使用せず、同じ方法で例外を実装しません)
一方、動作する理由:
-
C ++ライブラリは、異なるコンパイラから呼び出されることを意図した開発者によって、Cスタイルのインターフェイスで記述されています
-
1と同じ。
-
MinGWコンパイラのメーカーは、VCとバイナリ互換性を持たせました
事前に知る方法
わかりません。 DLLからエクスポートされた関数の名前、および/またはそのパブリック/エクスポートされたAPIを宣言するヘッダーファイルを投稿すると、(または互換性のない)C ++をエクスポートしているかどうかについての非常に強力なヒントが得られますスタイルのメソッドまたは(より互換性の高い)Cスタイル関数のエクスポート。
それ以外の場合、2段階の質問があります:
-
MinGWコードがVCコードを呼び出すために必要なこと(たとえば、C ++の代わりにC、たとえば、同じヒープを使用することを前提としない、たとえば、パラメーター受け渡し規則を指定する)?
-
VCライブラリはそれを念頭に置いて書かれていますか?
両方のコンパイラを使用した人は、おそらく最初の質問に答えることができます(私はMinGWを使用していません)。誰が2番目の質問に答えられるかわかりません。誰がそのVCライブラリを書いたのですか?
他のヒント
はい、再コンパイルせずにMSVCコンパイル済みライブラリをMinGW用に変換できます。
いくつかのツールとdllのみが必要です。 こちらをご覧ください。
CとC ++の混在について-バイナリのサイズが気にならない場合は、cプロジェクトにc ++コンパイラを使用してください。これにより、リンクしているライブラリで起こりうる問題について心配する必要がなくなります。