C ++模板dll =>未解决的外部

时间:2011-03-21 14:45:45

标签: c++ visual-studio-2010 templates dll

我在共享库中有一个模板功能。我知道函数将使用int或double参数调用。因此,我在源文件中实例化了两个版本的模板。

template void library::doSomething<int>(int const number);
template void library::doSomething<double>(double const number);

此解决方案适用于Linux上的g ++(获取* .so),但是当我尝试使用VS2010在Windows上将相同的代码编译为* .dll时,我收到如下错误:

  

错误LNK2001:未解析的外部符号doSomething

导出在* .def文件中提供,如:

  

EXPORTS

     

doSomething的

我是否遗漏了某些内容,或者此解决方案与Windows“不兼容”?

感谢。

彼得

1 个答案:

答案 0 :(得分:4)

您需要将实例化函数的受损名称放入DEF文件中,而不是C ++名称。

您可以在MSDN文章Exporting from a DLL Using DEF Files中找到更多信息:

  

如果要在C ++文件中导出函数,则必须将修饰的名称放在.def文件中,或者使用extern“C”定义标准C链接的导出函数。

     

如果需要将修饰后的名称放在.def文件中,可以使用DUMPBIN工具或使用链接器/ MAP选项获取它们。请注意,编译器生成的修饰名称是特定于编译器的。

     

如果将Visual C ++编译器生成的修饰名称放入.def文件中,则还必须使用相同版本的Visual C ++构建链接到DLL的应用程序,以便调用应用程序中的修饰名称与导出的名称匹配DLL的.def文件中的名称。

通常,使用__declspec(dllexport)要简单得多,如果你可以使用它,你应该考虑这样做。