私はほとんど Visual Studio に慣れていないので、これが基本的な問題である場合は申し訳ありません。いくつかのプロジェクトを含むソリューションがあります。プロジェクト A には、新しいクラスを追加した既存のファイル セットがあります。プロジェクト B は、プロジェクト A の新しいクラスでコーディングされた機能を使用します。プロジェクト A が最初にビルドされ、.lib ファイルが生成され、その .lib ファイルがプロジェクト B にリンクされます。ただし、.lib ファイルを作成しようとすると、プロジェクト BI の場合、追加したプロジェクト A の新しい機能を参照して、リンク エラーが発生します。プロジェクト A から生成された .lib ファイルで「dumpbin」コマンドを使用すると、追加した関数のシンボルがそこにないことに気付きました。ただし、プロジェクト A で新しいクラスをコンパイルした後に作成された .obj ファイルには、これらのシンボルが含まれています。これらのシンボルがプロジェクト A に存在しない理由は何ですか。
2868 次
1 に答える
15
これらは両方とも DLL プロジェクトであると想定しています。Windows では、シンボルを で装飾してエクスポートするか__declspec(dllexport)
、.DEF ファイルを使用してエクスポートするシンボルを指定する必要があります。
では__declspec
、これは通常、次のようなヘッダーを作成することによって実現されます。
#ifdef PROJECT_A_EXPORTS
#define PROJECT_A_API __declspec(dllexport)
#else
#define PROJECT_A_API __declspec(dllimport)
#endif
次に、クラスのすべてのメンバーをエクスポートする場合は、次のように記述します。
class PROJECT_A_API MyClass
{
// ...
};
そして、プロジェクト A をコンパイルするときに定義PROJECT_A_EXPORTS
し、プロジェクト B をコンパイルしないようにします。これにより、両方のプロジェクト間で同じ MyClass.h ヘッダー ファイルを共有できます。プロジェクト A をコンパイルするときはシンボルをエクスポートし、プロジェクト B をコンパイルするときはシンボルをインポートします。
DEF ファイル ルートに関する情報を次に示します。ただし、これを維持するのは難しい場合があります。C++ では、各シンボルの装飾名をリストする必要があり、面倒な場合があります。
于 2009-07-24T17:46:05.060 に答える