2012-01-23 15 views
4

私はMSVCとdllファイル(opennurbsと呼ばれるライブラリ)でコンパイルされた静的C++ライブラリを持っています。私はmingwによってコンパイルされたプロジェクトでこのライブラリを使用する必要があります(私はQt作成者を使用していますが、プロジェクトはqtライブラリを使用していません)。だから、私は未解決の外部を持っている。私は名前のmanglingと問題を考える。 .libファイルを.aライブラリに変換するにはどうすればよいですか? nmコマンドを使用しようとしましたが、動作しません: "foo.dllにシンボルがありません"。 Extern "C"はC++ライブラリであるため動作しません。mingwでMSVC++ .libファイルを使用しています。名前のマングリング

+0

静的ライブラリとDLLがあるとします。あれは正しいですか?つまり、2つの.libファイルがあることを意味します。 1つは、多くのコードを含むスタティックライブラリ用で、もう1つはインポートスタブを持つDLL用です。 –

+1

あなたは気づくことができます(私のように!)、 'cl'と' mingw'の 'ABI'が違います。ごめんなさい。 – Lol4t0

+0

Microsoftのコンパイラで作成されたバイナリファイルは、MinGW/GCCと互換性がありません。正常にリンクするには、ライブラリを再コンパイルする必要があります。 –

答えて

3

一般的に言って、あるコンパイラでビルドされたC++ DLLは、別のコンパイラで構築されたプログラムからは使用できません。名前のマングリングは、問題のほんの一例にすぎません。例外処理、RTTI、メモリ管理、またはクラスレイアウト自体(特に多重継承や仮想継承)の互換性保証はありません。

ヒント(理想的にそれらのなし):あなたは完全に元の問題を回避し、いずれかのコンパイラ用のバイナリを入手するか、ソースコードからビルドする(すなわち、両方のDLLをビルドすることができた場合

  • 最善の解決策はあるのあなたのケースではMinGWのクライアント)。
  • 純粋なC APIとしてDLLのインターフェイスを公開することができたら、それを行います。例えば。 Win32は "C API"であり、C/C++だけでなく、あらゆる種類のコンパイラでもうまく機能します。
  • DLL用に「オブジェクト指向」APIが必要な場合は、移植性は必要なく、必要な開発努力をする用意があります。
2

あなたの問題が何であるかを正確に理解することはむしろ困難ですが、1つの解決策は明らかです。 openNURBSコードは完全に許可されたライセンスで自由に入手できます。単にdownloadとそれをmingwで直接コンパイルする必要があります。

いずれにしても、これは実行可能な唯一のルートです。 C++には標準のバイナリインターフェイスはなく、各ツールには異なるバイナリインターフェイスがあります。これは、同じツールの異なるバージョン間でも異なる場合があります。さらに、MSVCコンパイルされたライブラリは、コンパイルされたコードとは異なるC++ランタイムライブラリに依存します。

したがって、要点は、mingwコンパイラによってコンパイルされたopenNURBSが必要なことです。しかし、ありがたいことに、ライブラリがソースとして配布されているために可能です。

+0

最新バージョンは私を助けません。 OpenNURBSの私のバージョンはmingwとコンパイルされません。とりあえずありがとう!私は解決策を見つけることを願っています。 – flamingo

関連する問題