写了个Timestamp的类,想使用Null Object模式表示空值,用于函数返回值,在tstamp.h文件中定义如下:
class __declspec(dllexport) Timestamp
{
....
public:
Timestamp(0);
static const Timestamp null;
};
然后在tstamp.cpp中对静态变量null进行了初始化
const Timestamp Timestamp::null(0);
编译,链接成DLL都没有问题。然后在另外一个程序的工程中使用这个DLL库,编译没有问题,可是链接的时候却有错误,提示为Timestamp::null没有定义(unresoulved symbol)。改成生成静态库,然后进行静态链接,即没有问题。
没办法,想办法改吧,然后就把null变量的初始化放到了tstamp.h文件里,结果动态链接成功,问题到目前为止算是解决了吧。可以,当程序里使用Timestamp的地方多起了来的时候,问题又出来了,因为有两个以上的编译单元引用了tstamp.h,结果又出现了链接错误,提示却是Timestamp::null重定义。
这回我可真没辙了,找了好些资料,也没有找到问题之所在。放到.h文件里重定义,放到.cpp文件里又说没定义,那应该怎么办呢?郁闷中。
现在没办法,改成使用静态库了,进行静态链接,没有问题,如何动态链接呢?期待答案中......
好几天过去了,问题终于解决了,原来的程序根本没有问题,是因为写定义宏的时候使用了一个#if defined(WIN32)的宏开关,WIN32只有在VC中创建WIN32程序时才会自动添加编译选项,定义WIN32宏,而我在创建测试程序时创建的是Empty Project,所以没有WIN32的宏定义,所以__declspec(dllimport)被替换为空,所以就没有引入对象的定义,所以才出错。这么多天没有解决的问题,就是一个小的细节没有注意到。SIGH!