ロードされた実行可能ファイルに含まれる静的変数にアクセスする必要がある共有ライブラリ (Linux では .so、Windows では .dll) があります。この変数はたまたまクラス テンプレート タイプであり、名前空間内にあります。変数を「extern」(および Windows では「__declspec(dllimport)」) として宣言しているにもかかわらず、DLL がリンクされている場合、VC10 はこの変数に対して「未解決の外部シンボル」エラーを出します。これは実際には解決されるべきではなく、代わりにロード時間に残されるべきであるため、私には奇妙に思えます。
ヘッダー:
// a header demonstrating MSVC-compatible linkage
#ifdef _MSC_VER
#ifdef I_AM_DLL
#define TO_DLL_LINKAGE __declspec( dllimport )
#else
#define TO_DLL_LINKAGE __declspec( dllexport )
#endif
#else // not MSVC
#define TO_DLL_LINKAGE
#endif
template<class T>
class TheClass
{
public:
TheClass(T t) : value_(t) {}
T value() const
{
return value_;
}
private:
T value_;
};
typedef TheClass<int> MyClass;
そしてDLL:
// a test library (DLL) for linkage experiment
#define I_AM_DLL
#include "theclass.hpp"
#include <iostream>
namespace foo {
extern TO_DLL_LINKAGE MyClass theObject;
}
void bar() {
int i = foo::theObject.value();
std::cout << "object value is " << i << std::endl;
}
エラー:
エラー LNK2001: 未解決の外部シンボル "_ declspec(dllimport) クラス TheClass foo::theObject" ( _imp_?theObject@foo@@3V?$TheClass@H@@A)
これが gcc で問題なく動作することは言うまでもありません。同様の StackOverflow の質問もいくつか確認しましたが、既に行っていることを推奨しているか、さまざまな理由 (インポートではなくエクスポート、クラス インスタンスではなくクラスなど) で適用されていません。
MSVC10 を満足させるには、どのような追加の魔法が必要ですか? ありがとう。