0

我在 dll 中有这个模板智能指针类。

sp.h
---------

#ifdef VLIB_EXPORTS
#define VLIB_API __declspec(dllexport)
#else
#define VLIB_API __declspec(dllimport)
#endif


template < typename T > class VLIB_API SP
{
protected:
        T*    m_pData;
    long*       m_pRefCounter;

public:


    SP(void);
    {
        m_pData = NULL;
        m_pRefCounter = NULL;
    }

    ...
    ...
};

ImagePtr.h
---------------
class VLIB_API CVImagePtr
{
    ....
}




MainLib.h
-------------
#include sp.h
#include ImagePtr.h


typedef SP<CVBlob> CVBlobPtr;

class VLIB_API CVLib
{
public:
    virtual CVBlobPtr CreateBlob() = 0;
    virtual CVImagePtr CreateImg() = 0;
};

当我尝试在另一个项目(CVMLib)中使用这个类时,编译器会报错:error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall SP::~SP(void)"

但 CVImagePtr 没问题。

class VMLIB_API CVMLib : public CVLib
{
public:
    virtual  CVBlobPtr CreateBlob();
    virtual CVImagePtr CreateImg();
};

当类是模板时似乎存在问题。如果是这样,我如何导出模板类?

有人可以帮我解决这个问题吗?谢谢!

4

2 回答 2

0

正如怀疑的那样,我没有正确导出模板类。这就是我所做的:

主库.h

#include sp.h
#include ImagePtr.h

#ifdef VLIB_EXPORTS
#define VLIB_API __declspec(dllexport)
#define EXPIMP_TEMPLATE
#else
#define VLIB_API __declspec(dllimport)
#define EXPIMP_TEMPLATE extern
#endif

EXPIMP_TEMPLATE template class VLIB_API SP<CVBlob>;
typedef SP<CVBlob> CVBlobPtr;

class VLIB_API CVLib
{
public:
    virtual CVBlobPtr CreateBlob() = 0;
    virtual CVImagePtr CreateImg() = 0;
};

您可以在此处找到更多信息:http: //support.microsoft.com/kb/168958

于 2012-11-12T06:33:58.313 回答
-1

您需要使用标记类,extern "C"以便在类的实现以及标题上具有未损坏的名称。

看看这个规范的答案为什么。

于 2012-11-12T03:02:03.127 回答