我有一个共享库(Linux 中的 .so,Windows 中的 .dll)需要访问包含在它加载的任何可执行文件中的静态变量。这个变量恰好是一个类模板类型,并且在一个命名空间内。尽管将变量声明为“extern”(在 Windows 上为“__declspec(dllimport)”),VC10在链接 DLL 时为该变量给出“未解析的外部符号”错误。这对我来说似乎很奇怪,因为它确实不应该解决,而是留给加载时间。
标题:
// 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) class TheClass foo::theObject”( _imp_?theObject@foo@@3V?$TheClass@H@@A)
我想不用说这在 gcc 中可以正常工作。我还查看了许多类似的 StackOverflow 问题,但它们要么推荐我已经在做的事情,要么由于各种原因不适用(例如导出而不是导入,类而不是类实例等)。
我需要什么额外的魔法才能让 MSVC10 开心?谢谢。