web-dev-qa-db-ja.com

VisualStudioとgcc間の* .dll * .a * .lib * .defの互換性

これは非常に紛らわしいです。スタックなどでこれに関する投稿を読むのに多くの時間を費やしました。それでも混乱しています。

コーディングにはQtとC++を使用しています。 Qtでは、コンパイラーにgccオプションを使用しています。
問題は、私が試した多くのサードパーティライブラリが機能していないように見えることです。

.dll、.a、.lib、.defファイルおよびライブラリスキームは初めてです。

質問1:

私の限られた経験では(これまでに7つまたは9つのライブラリを試しました)、ライブラリのサプライヤは、.dllがVisualStudioで作成されたのかgccで作成されたのかをほとんど教えてくれません。これは多くの混乱を追加します。ライブラリがどのコンパイラと互換性があるかを明確にすることはほとんどありません。だから私はこの悪夢に対処する方法のいくつかの実際のヒントをいただければ幸いです。私が試したほとんどすべてのライブラリはオープンソースプロジェクトです。ここでは名前を付けませんが、これらはよく知られているプロジェクトです。問題は私の知識不足だと確信しています...

MinGWおよびgcc World

質問2:
私が知る限り、MinGWgccユニバースの動的C++ライブラリにはこれらが必要ですよね?
*。h
*。dll
*。a

質問3:
残念ながら、.aファイルが欠落していることが多く、ライブラリが機能しません。これは非常に紛らわしいです。 .aファイルが欠落している場合、私は運が悪いですか?

質問4:
*。dllがgccで作成されている場合、MinGW/gccの.aファイルを生成できますか?

質問5:* .dllがVisualStudioで作成されている場合、MinGW/gccの.aファイルを生成できますか?

質問6:
*。dll(MinGW/gccで作成)が古すぎて、新しいMinGW/gccと互換性がなくなっている可能性はありますか?

質問7:
MinGW/gccを使用するQtプロジェクトでは、*。libファイルは必要ありませんよね?それはVisualStudioだけですよね?

質問8:
MinGW/gccを使用するQtプロジェクトで* .dllを使用するのに* .defファイルは必要ありませんよね?

VisualStudio World

質問9:
私が知る限り、VisualStudioの動的C++ライブラリには次のものが必要です。
*。h
*。dll
*。lib

正しい?繰り返しますが、問題は、*。libファイルがほとんど常に欠落していることです。さらに、ライブラリが互換性のあるコンパイラについての明確な指示はありません。では、それがVisualStudio専用かどうかをどうやって知ることができますか?

質問10:
。libファイルが見つからない場合、運が悪いですか?

質問11:
*。dllがVisualStudioで作成されている場合、VisualStudioの.libファイルを生成できますか?どうやって?

質問12:
*。dllがMinGW/gccで作成されている場合、VisualStudio用の.libファイルを生成できますか?どうやって?

質問13:
*。dll(VisualStudioで作成)が古すぎて、新しいVisualStudioと互換性がなくなっている可能性はありますか?

質問14:
QtCreatorでVisualStudioコンパイラを選択した場合、それは他の誰かがREAL VisualStudioでコンパイルしたダイナミックライブラリと100%互換性がありますか? Qt CreatorのVisualStudioコンパイラオプションは、偽のVisualStudioコンパイラだと思います。

質問15:
QtCreatorでMinGW/gccコンパイラを選択した場合、他の誰かがREAL VisualStudioでコンパイルしたQtダイナミックライブラリで使用できますか?

質問16:
MinGW/gccを使用するQtプロジェクトで* .dllを使用するのに* .defファイルは必要ありませんよね?

質問17:REALVisualStudioで作成された* lib(*。dllおよび* .hで動作する)ファイルを* .aファイルに変換して、変更されていない* .dllで* .aファイルを使用できるようにすることはできますか? * Qt gccプロジェクトの.hファイル?

21
user1118167

たぶん、最初から始めて、自分より先に進んでコアの問題を説明しない価値があります。この回答から、いくつかの質問を導き出すことができます。

スタートはABI(アプリケーションバイナリインターフェイス)です。これは次のようなものを定義します

  • 関数がどのように呼び出されるか、例:どのパラメータがどのレジスタに入るのか、またはそれらがスタックのどの場所に置くのか
  • 例外がどのようにスローされるか
  • オブジェクトのレイアウト方法(例: 「vtableポインタ」の行き先、使用されるパディング
  • 組み込みデータ型の大きさ
  • 関数名がシンボルに「マングル」される方法
  • タイプ情報のレイアウト方法
  • 標準ライブラリクラスのレイアウト
  • 等.

ほとんどのプラットフォームはCABIを定義しますが、しない C++ ABIを定義します。その結果、コンパイラーは独自のABIを定義します(通常そこにあるCのものを除くすべてに対して)。これにより、異なるコンパイラ間(場合によっては同じコンパイラのバージョン間でも)で互換性のないオブジェクトファイルが生成されます。

通常、これはどういうわけか未定義の奇妙な名前で現れます。異なるABIは、とにかく機能しない実行可能ファイルを誤ってリンクすることを防ぐために、意図的に異なる名前マングリングを使用します。これらを回避するための最善の策は、同じコンパイラを使用してすべてのコンポーネントをビルドすることです。

ライブラリがどのコンパイラでビルドされているかを確認したい場合は、適切なツールを使用してその内容を確認できます。あなたがWindowsを要求したことは承知していますが、私はUNIXツールしか知りません(MingWで利用できる場合があります)。

  • シンボル名を確認するためのnm(通常はlessまたはgrepと一緒に)
  • ライブラリを構築または検査するためのar
  • オブジェクトに埋め込まれた特別な文字列を見つけるためのident
  • すべての文字列を愛する文字列
  • シンボルをC++宣言にデマングルするc ++ filt

シンボルを見ると、通常、コンパイラがシンボルを生成したものが識別されます。それらを十分に頻繁に見た場合は、シンボル自体からABIを区別することもできます。

このエリアにはもっとたくさんありますが、スタミナが足りなくなりました... :-)いずれにせよ、これは上記の質問のいくつかに答えると思います。

15
Dietmar Kühl

Windows用のCode :: Blocks c ++コンパイラを使用して.aファイルを作成するために使用するツールを検索しているときに、この質問に遭遇しました。 Code:BlocksはMinGWgccコンパイラを使用します。グーグルでは、私の降霊術を検証するのに十分な高さだったと思います。

ダイナミックリンクライブラリ(dll)はさまざまです。いくつかは、それらが作成されたプログラミング言語とコンパイラの外でそれらを使用するのを非常に困難にする方法でコンパイルすることができます。

ただし、多くの場合、dllはクリーンなCインターフェイスで作成されます。その場合、私が答えることができると思うあなたの質問に対する答えは次のとおりです。

1:それは問題ではありません。

2、9:はい

3、10:いいえ

4、11:はい。 MinGWには、.dllファイルと.defファイルを取得して.aファイルを作成するツール(dlltool.exe)が含まれています。MSVisualStudioには、同じことを行うためのツール(lib.exeと呼ばれると思います)も含まれています。また、別のコンパイラを使い始めると、おそらくそれらにもツールがあることに気付くでしょう。 Borlandsコンパイラにはimplib.exeツールがありました。

5、12:はい(4と同じ)

6、13:pew ... dllには有効期限はないと思いますが、適切なオペレーティングシステム用にコンパイルする必要があります。

8、16:.aまたは.libを作成するには.defが必要です。それがない場合は、実際には.dllから作成することができます。

7
Lars Betak

A DLLは本質的にコンパイルされたアプリケーションであり、EXEファイルではなく関数ライブラリの形式です。他のアプリケーションはそのDLL関数、関数を含むdll、パラメータ、戻り値などを宣言するだけです。

アプリケーションが「ダイナミックリンクライブラリ」を使用してコンパイルされる場合、DLLはシステムにすでに存在している必要があるため、必要なDLLをインストーラに含めるか、ターゲットコンピュータにすでに存在することを期待する必要があります。 DLLを使用すると、アプリのサイズが全体的に小さくなります。

DLLの作成は、他のアプリケーションの作成と同じです。ビルドを、EXEなどではなくDLLとしてターゲットにするだけです。

DLL、EXEなどのアプリケーションを作成するには、必要なソースコードとヘッダーが必要です。 .hファイルには、関数、データ型、クラスなどの宣言が含まれています。コードが含まれることはめったにありません。 .defは.hによく似ていますが、通常はリンカの一連の命令です。

コンパイルすると、.hや.cなどが.objに変換されます(オブジェクトファイル)。複数のオブジェクトファイルがリンクされて、DLLまたはEXE)が作成されます。

.libファイルは静的ライブラリです。基本的には、リンク段階で結合された一連の.objファイル(または1つの.obj)です。

.objファイルと.libファイルの形式はコンパイラに固有である可能性があり、コンパイラ間で互換性があることはめったにありません。元のソースコード、またはコンパイラ用に特別に作成された.objまたは.libが必要です。

「ダイナミックリンクライブラリ」を使用してEXEを作成することを選択すると、使用できるDLLが必要になります。 「静的にリンクされたライブラリ」を選択すると、リンカはEXEを生成する前に必要な.libファイルを見つけます。これらのDLLは必要ありません。

4
Matt H

質問1:.hファイルをインポートし、リンカーコマンドで.aファイルをリンクし、.dll出力の近くに.exeをコピーする必要があります。

質問2:.aファイルを.defファイルで作成できます

set PATH=C:\Program Files\CodeBlocks\MinGW\bin;%PATH%

dlltool.exe -d libfftw3-3.def -l libfftw3-3.a

質問3:いいえ。 .defファイルを手動で作成し、.aファイルを作成した後に作成できます。

質問4,5:はい

質問6:コンパイラではなくハードウェアとオペレーティングシステムに依存していると思います。

質問7:わかりません。

質問8:.defではなく.h.a.dllのみが必要です

質問9:.libファイルはVisualStudio用です。

質問10:.defを作成するのに.dll.libは必要ありません。また、. defがない場合は、自分で作成できます。

set PATH=C:\Program Files\Microsoft Visual Studio 12.0\VC\bin;%PATH%

lib /machine:x86 /def:libfftw3-3.def

または

lib /machine:x64 /def:libfftw3-3.def

質問11:はい、私は上であなたに言いました。

質問12:はい

質問13:いいえ。

0
Amir