1

2つの既存の実行可能ファイルAとTがありますが、同じソリューションで、触れる前はどちらも正常に実行されていました。実行可能ファイルAには、クラスPを定義するヘッダーと、静的インスタンスMyPのプロトタイプがあります。定義はプロジェクトAでコンパイルされます。実行可能ファイルTでは、プロジェクトAでMyPのメンバー関数を呼び出したいので、クラスの宣言にdllimport / exportマクロを追加し、ヘッダー(定義ではない)にMyPを追加しました。プロジェクトTにヘッダーが含まれています。dllimport/exportマクロは標準であり、A_EXPORTSはプロジェクトAで定義されていますが、Tでは定義されていません。

#ifdef A_EXPORTS
#define A_API __declspec(dllexport)
#else
#define A_API __declspec(dllimport)
#endif

//various definitions and includes, defining ENUM_RECORDING_TYPE and ERROR
A_API HFILE viosopen(const _TCHAR *path, ENUM_RECORDING_TYPE rt, int flags);
A_API struct P { 
    ERROR B(SHORT phraseNum);
};
A_API extern P MyP;

ソリューションのプロジェクトTへの依存関係としてプロジェクトAを追加しました。まだ正常にコンパイルされますが、Tはunresolved external symbol "__declspec(import) <snip> referenced in function <snip>関数呼び出しとunresolved external symbol "__declspec(dllimport) class P MyP" <snip>静的オブジェクトを考え出します。また、リンクを開始した直後の出力ログにも表示されます。Creating library Debug/A.lib and object Debug/A.expこれは、既存の実行可能ファイルに対してリンクしているはずなので、不吉なようです。

私の質問は、MSVC2010にそれらがどこにあるかをどのように伝えることができるかということです。Aを依存関係として設定するだけで、自動的にそれがわかると思いました。既存の実行可能ファイルに対してリンクできますよね?

4

2 に答える 2

2

プログラムを静的にリンクするために、__ declspec()のものは必要ありません。また、LIBファイルを作成するための別のプロジェクトも必要ありません。Aプロジェクトの.objファイルを使用してリンクするだけでよいと思います。

プロジェクトにはヘッダーファイルがあり、おそらくそのヘッダーに記述されている項目の実装を含む.cppファイルがあります。foo.hヘッダーファイルがであり、関連する実装がであるとしましょうfoo.cpp。コンパイルすると、または中間フォルダーfoo.objに中間ファイルが存在するはずです。そのファイルはリンカで使用できます。<solutiondir>\A\Debug<solutiondir>\A\release

プロジェクトTのプロパティで、リンカー|を見つけます。「AdditionalDependencies」プロパティを入力および変更して、foo.objファイルを含めます。1つのアプローチは、相対ファイルパスを使用してファイルを見つけることです(たとえば..\A\Debug\foo.obj、デバッグ構成で)。もう1つの方法は、「追加の依存関係」で単純なファイル名を使用してから、foo.objリンカー|を使用することです。一般| リンカがファイルを見つけるのに役立つ「追加のライブラリディレクトリ」-たとえば、マクロ..\A\$(IntDir)を使用する$(IntDir)と、デバッグ設定とリリース設定で同じ値が機能するという利点があります。

TプロジェクトからAプロジェクトへのビルド依存関係を設定して、Aプロジェクトが最初にコンパイルされるようにすることを忘れないでください。そうしfoo.objないと、Tリンカーがファイルを検索するときにファイルが存在しない可能性があります。ソリューションのプロパティで、[プロジェクトの依存関係]を選択し、[プロジェクトTがプロジェクトAに依存する]を設定します。

動的にリンクするには、 A.LIB@ajayが言ったようにファイルを使用する必要があります。は__declspec(DllImport)、インポートする関数とデータをコンパイラに通知しますが、それらをどこからインポートするかは通知しません。

リンカへの入力としてファイルを使用することは、静的リンクの場合にファイルA.LIBを使用することとほとんど同じfoo.objですが、libファイルが<solutiondir>\Debugプロジェクトの中間ディレクトリではなくソリューションの出力ディレクトリに配置される点が異なります<solutiondir>\A\Debug

DLLの作成と使用に関するこのウォークスルーは、役立つ背景になる可能性があります。

于 2011-08-12T20:56:18.417 に答える
0

プロジェクトAはEXEではなくDLLであり、LIBファイルを正常に生成していると思います。プロジェクトBのリンカー入力として使用する必要がありA.LIBます。LIBファイルを作成するだけでは、他のプロジェクトが自動的にリンクされません。

于 2011-08-12T08:14:14.913 に答える