DLL仅导出某些模板化函数

时间:2009-06-04 03:43:36

标签: c++

嘿所有,所以这对我来说似乎是一个相当奇怪的问题。我有一个非常简单的模板化容器类,它是DLL的一部分。整个类在头文件中定义,以允许自动生成模板。现在DLL的另一部分实际上请求生成某个模板类型,因此代码应该存在于DLL中。但是,当使用来自另一个可执行文件的对象时,构造函数/析构函数以及多个其他函数都可以工作,但链接器找不到2个函数。以下是这两个函数的代码,以及工作函数。

const T** getData() const
{
    return m_data;
}

int getNumRows() const
{
    return m_nRows;
}

int getNumCols() const
{
    return m_nCols;
}

因此链接器找不到getNumRows()和getNumCols()函数,但getData()函数是。这是一个常见问题,函数是否需要有一个模板化参数才能生成?

@ 1 800信息

我已经通过标准宏从DLL导出了这个:

#ifdef ACORE_EXPORTS
#define ACORE_API __declspec(dllexport)
#else
#define ACORE_API __declspec(dllimport)
#endif

在班级定义中:

template < class T >
class ACORE_API matrix

2 个答案:

答案 0 :(得分:7)

编译器只生成实际调用的成员函数。

例如:

template <class T>
class MyClass
{public:
    int function1()
    {
        return 0;
    }
    int function2()
    {
        T t;
        t->DoSomething();
        return 0;
    }
};

然后再

MyClass<int> m;
m.function1();

编译,因为从未编译过MyClass :: function2()。

您可以通过执行以下操作强制实例化整个类:

template class MyClass<int>;

在这种情况下,将实例化类中的每个方法。在此示例中,您将收到编译器错误。

答案 1 :(得分:1)

您是否实际从库中导出功能?您可以在.def文件中提及名称,或使用dllexportdllimport指令来完成此操作。