静的メンバーを持つクラスを含むDLLがあります。__declspec(dllexport)
このクラスのメソッドを利用するために使用します。しかし、それを別のプロジェクトにリンクしてコンパイルしようとすると、静的データに対して「未解決の外部シンボル」エラーが発生します。
例:DLLでは、Test.h
class __declspec(dllexport) Test{
protected:
static int d;
public:
static void m(){int x = a;}
}
DLLでは、Test.cpp
#include "Test.h"
int Test::d;
Testを使用するアプリケーションでは、m()を呼び出します。
また、メソッドごとに__declspec(dllexport)を個別に使用しようとしましたが、静的メンバーに対して同じリンクエラーが発生します。
dumpbinを使用してDLL(.lib)を確認すると、シンボルがエクスポートされていることがわかります。
たとえば、アプリはリンク時に次のエラーを出します。
1>Main.obj : error LNK2001: unresolved external symbol "protected: static int CalcEngine::i_MatrixRow" (?i_MatrixRow@CalcEngine@@1HA)
ただし、.libのdumpbinには次のものが含まれています。
Version : 0
Machine : 14C (x86)
TimeDateStamp: 4BA3611A Fri Mar 19 17:03:46 2010
SizeOfData : 0000002C
DLL name : CalcEngine.dll
Symbol name : ?i_MatrixRow@CalcEngine@@1HA (protected: static int CalcEngine::i_MatrixRow)
Type : data
Name type : name
Hint : 31
Name : ?i_MatrixRow@CalcEngine@@1HA
これを解決する方法がわかりません。私は何が間違っているのですか?これらのエラーをどのように克服できますか?
PSコードは元々Linux用に開発されており、.so/binaryの組み合わせは問題なく機能します
編集:与えられたケースでは、静的変数はアプリケーションによって直接参照されませんが、メソッドはヘッダーにあるためインライン化されます。メソッドを.cppファイルに移動することで、リンクエラーを解決できました。