我在共享库中有一个模板功能。我知道函数将使用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“不兼容”?
感谢。
彼得
答案 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)
要简单得多,如果你可以使用它,你应该考虑这样做。