web-dev-qa-db-ja.com

MSVCへのリンクDLL MinGWから

LizardTech GeoExpress DSDKを自分のアプリケーションにリンクしようとしています。プラットフォーム用にコンパイルできるように、gccを使用しています。 LinuxとMacでは、これは簡単に機能します。静的ライブラリ(libltidsdk.a)とヘッダー、そして私たちがしなければならないすべてはそれらを使用することです。

ウィンドウズのためのコンパイルはそれほど簡単ではありません。彼らはMicrosoft Visual Studioを使用してライブラリを構築し、MinGWを使用しています。 MinGW FAQを読んだところ、以下の問題が発生しています。ライブラリはすべてC++なので、私の最初の質問:これは可能ですか?

提供されているようにdllに対してリンクするだけでは、すべてのC++呼び出し(コンストラクター、デストラクター、メソッドなど)に対して「未定義の参照」エラーが発生します。

MinGW Wikiに基づく: http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs ユーティリティreimpを使用してを変換できるはずです。 libを使用可能なものに変換します。 LizardTechが提供するすべての.libファイルを試してみましたが、それらはすべて「無効または破損したインポートライブラリ」を提供します。 reimpユーティリティのバージョン0.4と0.3の両方を試しました。

Wikiで説明されている2番目の方法を使用して、dllに対してpexportとdlltoolを実行して.aアーカイブを取得しましたが、同じ未定義の参照が生成されます。

ところで:私は以下の議論を読みました。これが可能かどうかについてはあいまいさが残り、MinGW Wikiページを考えると、これは実行可能であるように思われます。それが不可能な場合、私が知る必要があるのはそれだけです。それができるなら、どうすれば実現できるのか知りたいです。

g ++からVS2008で生成された.libsにリンクする方法

ありがとう!

31
IndigoFire

これはできません。 C関数ではなく、dllからC++クラスをエクスポートしました。違いは、c ++関数は常に、コンパイラの特定のバージョンに固有のマングル形式の名前でエクスポートされることです。

それらのDLLはその形式でのみmsvcで使用可能であり、Microsoftが以前にマングリングスキームを変更したため、msvcの異なるバージョン間でも動作しない可能性があります。

あなたが何らかのレバレッジを持っているなら、あなたは彼らに彼らの邪悪なやり方を変えるようにさせる必要があります。それ以外の場合は、すべてのクラスをインポートし、インターフェイスを返すc関数を介してそれらを再エクスポートする、shim dllを書き込むためにMSVCを使用する必要があります。

24
Chris Becke

私は ほとんど そのようなコンパイラ間でC++ライブラリをリンクできないことを確認してください。一生懸命頑張ってみましたが、ずいぶん前のことで詳細は覚えていません。ハックの多いCライブラリは可能だと思います。

3
Chris H

WindowsでDLLを使用するには、インポートライブラリに対してリンクします(DLL自体ではありません)。インポートライブラリには通常、静的ライブラリのように拡張子.libが付きます。ライブラリ)。WindowsSDKをダウンロードすると、すべてのシステムDLLのインポートライブラリを取得できます。

あなたの質問から、.dllと.libを混同しているように思えます。 reimpはDLLを入力として使用せず、MinGWと互換性のある.LIBインポートライブラリを作成しませんか?

MinGWで調べたところはWikipediaにあります。その記事によると、MinGWには再配布可能なインポートライブラリが付属しています。

0
Adrian McCarthy

ここに2セント追加すると思いました。

MSVCでdllをリンクする場合は、.dll内の対応する関数を呼び出す関数スタブを含む.libをリンクします(マングル名に「__imp__」を追加した間接参照)。理論的には、関数がエクスポートテーブルによって公開されている場合、dllに直接リンクすることが簡単にできるため、GCCはそれを行いません。 MinGWのGCCに-lを直接使用してdllを調べるように指示できます。 C++の命名体系は、MSVCのいくつかの異なるバージョン間では異なりますが、すべてのバージョン間で異なるわけではありません。それらはほとんどのバージョンで一貫しており、新機能が実装されると拡張機能が追加されます。

ただし、MinGWは、外部シンボルの検索を含むGCC名のマングリング方式を使用しているため、MSVCのマングル名を認識しません。リンカは、MSVCと一致するように外部シンボルを再マングリングし、一致があるかどうかを再度確認することで、これを簡単に解決できます。多分これはいつか実装されるでしょう。同様の方法で自分のプログラミング言語でこれを解決しましたが、もちろんこれには自分のリンカーが含まれています。

MinGWでGCCに.libを提供することは完全に可能です。ソースファイルを指定するのと同じようにコマンドラインでGCCを指定するだけです。 gcc -o test.cpp main.cpp external.lib…これは、リンカに検索対象のマングル名を提供します。 MinGWは、MSVCのマングル名も処理できます。さらに、libmangleに独自のMSVCマングラー/デマングラーがあります。

0