2012-02-19 6 views
4

私は、Windows上のMinGW + MSYS32上にしか構築できない古いライブラリ(C++)を持っています。これから、GNU libtoolから生成された.aスタティックライブラリファイルを生成できます。私の主な開発はVisual Studio 2008で行われています.MinGWで作成したライブラリをVisual Studioでリンクしようとすると、外見が見つからないという不満があります。これは、C++シンボルのマングリングが行われ、.aファイルのwhatsと一致しないことが原因です。静的な.aファイルをVC++ライブラリ形式に変換する方法はありますか?MinGW .aからVC++ .libに変換する

+0

いいえ、これはできません。バイナリをリンクするために使用するコンパイラで再コンパイルする必要があります。 –

答えて

3

シンボルが異なる場合、コンパイラは異なるABIを使用しており、コンパイルされたライブラリを "変換"することはできません。さまざまな方法でマージされた理由名は、異なるABIを使用してオブジェクトファイルから実行可能ファイルを構築します。 ABIは、引数の受け渡し方法、仮想関数テーブルの表現方法、例外の発生方法、基本データ型のサイズなど、さまざまな要素を定義しています。名前のマングリングもこれの一部であり、効率的で同じプラットフォーム上の他のABIとは異なるように慎重に選択されています。名前のマングリングが本当に異なるかどうかを確認する最も簡単な方法は、両方のコンパイラで基本タイプのみを使用してシンボルを見る(UNIXの場合はnmを使用します。 Windowsのプログラマであり、私はそこでどのツールを使うべきかわかりません)。レイアウトとMinGWの(libstdc++)で使用される標準C++ライブラリおよびVisual Studio(Dinkumware)の実装は互換性がありません:

Wikipediaに基づいて、MinGWのはまた別のランタイムライブラリを使用しているようです。 2つのコンパイラ間のABIが同じであっても、使用される標準のC++ライブラリはありません。 ABIが同じ場合、あるコンパイラがそれぞれの他のコンパイラの標準ライブラリを使用するように、設定されたものを置き換える必要があります。既にコンパイルされたライブラリでこれを行う方法はありません。これが実行可能かどうかわかりません。

私はこれらの2つの異なるコンパイラの間で物事をリンクしようとするのは気にしません。代わりに、インプリメンテーションを共通のコンパイラに移植し、そこから実行する必要があります。

+0

一般に、Cコードは異なるコンパイラから使用できることに注意してください。 MinGW GCCはVC .libファイルにリンクできますが、その逆はできません。 – rubenvb

2

defファイルを検索し、コマンドを実行します。 lib/machine:i386 /def:test.def インポートライブラリファイルを生成します。

関連する問題