2009-07-24 25 views
0

私はほとんどがVisual Studioを初めて使用しているので、これが基本的な問題であればお詫び申し上げます。私はいくつかのプロジェクトを含むソリューションを持っています。プロジェクトAでは、新しいクラスを追加した既存のファイルセットがあります。プロジェクトBは、プロジェクトAの新しいクラスでコード化された機能を使用します。プロジェクトAが最初に作成され、.libファイルが生成され、その.libファイルがプロジェクトBにリンクされます。ただし、.libファイルProject BI用にリンクエラーが発生し、追加したProject Aの新機能を参照しています。プロジェクトAから生成された.libファイルで 'dumpbin'コマンドを使用すると、私が追加した関数のシンボルが存在しないことがわかります。ただし、プロジェクトAで新しいクラスをコンパイルした後に作成された.objファイルには、これらのシンボルが含まれています。これらのシンボルがProject Aの.libファイルに存在しない理由は何ですか?Visual Studio 2005リンカの問題

答えて

13

これらは両方ともDLLプロジェクトであると仮定します。 Windowsでは、記号を__declspec(dllexport)で飾り付けてエクスポートするか、エクスポートするシンボルを示すために.DEFファイルを使用する必要があります。

#ifdef PROJECT_A_EXPORTS 
#define PROJECT_A_API __declspec(dllexport) 
#else 
#define PROJECT_A_API __declspec(dllimport) 
#endif 

あなたはクラスのすべてのメンバーをエクスポートするときに、あなたが書いた:

class PROJECT_A_API MyClass 
{ 
    // ... 
}; 

と定義__declspec

が、これは通常、このようなヘッダに何かを作成することによって達成されますPROJECT_A_EXPORTSプロジェクトBではなくプロジェクトAをコンパイルすると、両方のプロジェクトで同じMyClass.hヘッダーファイルを共有できます。プロジェクトAをコンパイルするときはシンボルをエクスポートし、プロジェクトBをコンパイルするときはシンボルをインポートします。

ここにいくつかはinformation on the DEF file routeです。ただし、これを維持するのは難しいかもしれません.C++では、各シンボルの装飾された名前をリストする必要があります。これは痛みを伴う可能性があります。

+0

それはそれを修正しました。どうもありがとうございました! –

+7

それで彼の答えを受け入れてください。彼に彼の15ポイントを与える:) – Goz