C++ Null Object模式在DLL中导出失败的困惑

写了个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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值