Windows の MinGW+MSYS32 でのみビルドできる古いライブラリ (C++) があります。そこから、GNU libtool から生成された .a スタティック ライブラリ ファイルを生成できます。私の主な開発は Visual Studio 2008 で行われます。MinGW で作成されたライブラリを取得して Visual Studio でリンクしようとすると、externals が見つからないというエラーが表示されます。これは、C++ シンボル マングリングが行われ、.a ファイルの内容と一致しないことが原因である可能性が最も高いです。静的 .a ファイルを VC++ ライブラリ形式に変換する既知の方法はありますか?
2 に答える
シンボルが異なる方法でマングルされている場合、コンパイラは異なる ABI を使用しており、コンパイルされたライブラリを「変換」することはできません。名前がさまざまな方法でマングルされている理由は、ユーザーが実行可能ファイルのビルドに成功しないようにするためです。異なる ABI を使用してオブジェクト ファイルから。ABI は、引数の受け渡し方法、仮想関数テーブルの表現方法、例外のスロー方法、基本データ型のサイズ、およびその他多数の事項を定義します。名前マングリングもこれの一部であり、効率的で、同じプラットフォーム上の他の ABI とは異なるように慎重に選択されています。名前マングリングが実際に異なるかどうかを確認する最も簡単な方法は、両方のコンパイラで基本型のみを使用していくつかの関数を含むファイルをコンパイルし、シンボルを確認することです (UNIX では使用します)。nm
このため; 私は Windows プログラマーではないので、どのツールを使用すればよいかわかりません)。
ウィキペディアによると、MinGW は別のランタイム ライブラリも使用しているようです。MinGW ( libstdc++ ) と Visual Studio ( Dinkumware ) で使用される標準 C++ ライブラリのレイアウトと実装には互換性がありません。2 つのコンパイラ間の ABI が同じであっても、使用される標準 C++ ライブラリは異なります。ABI が同じ場合、1 つのコンパイラがそれぞれの他のコンパイラの標準ライブラリを使用するように設定を置き換える必要があります。コンパイル済みのライブラリでこれを行う方法はありません。これが実行可能かどうかはわかりません。
個人的には、これら 2 つの異なるコンパイラ間で何かをリンクしようとすることは気にしません。代わりに、実装を一般的なコンパイラに移植し、そこから移動する必要があります。
def ファイルを検索し、コマンド lib /machine:i386 /def:test.def を実行すると、インポート lib ファイルが生成されます。