构造函数重载类获取链接器错误使用DLL?

Posted

技术标签:

【中文标题】构造函数重载类获取链接器错误使用DLL?【英文标题】:constructor overloading Class get Linker Error Using DLL? 【发布时间】:2014-03-14 06:38:11 【问题描述】:

我创建了动态链接到 MFC 的常规 DLL。 在 dll 项目中构建 dll 之前,我使用了添加另一个类。这个类提供了更多的构造函数重载方法。 然后我在使用这个 lib 和 dll 文件包含项目后成功构建了 dll,然后在使用构造函数重载类时构建并获取链接器错误

我的班级名称:对象

Error   11  error LNK2001: unresolved external symbol "public: __thiscall AvinashiAMF::Object::~Object(void)" (??1Object@AvinashiAMF@@QAE@XZ)   BuleCappServiceUseDynamicDllDlg.obj

Error   10  error LNK2001: unresolved external symbol "public: __thiscall AvinashiAMF::Object::Object(enum AvinashiAMF::ObjectType,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0Object@AvinashiAMF@@QAE@W4ObjectType@1@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)   BuleCappServiceUseDynamicDllDlg.obj

Error   12  fatal error LNK1120: 2 unresolved externals D:\Test Aplications\Visual Studio 2008\Projects\BuleCappServiceUseDynamicDll\Release\BuleCappServiceUseDynamicDll.exe

【问题讨论】:

【参考方案1】:

您可能没有导出您的课程。看这里http://msdn.microsoft.com/en-us/library/81h27t8c.aspx

此外,检查此类问题的好工具是depends.exe,它包含在Visual Studio 中,它允许您检查导出和导入的符号。

【讨论】:

所有导出的函数都有效,但我将“Object”类声明为“Object result;”它超越了链接错误 那么在你的可执行文件中使用它时,你可能会丢失头文件上的 dllimport。另请注意,命名类 Object 可能不是一个好主意,因为它可能与其他类冲突(在您的特定问题上可能不是这种情况)。这里有更详细的示例msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx(请参阅“在数据上使用 __declspec(dllexport) 和 __declspec(dllimport)”中的预处理器条件,对您的课程使用相同的想法) 在哪里使用dllimport头文件?我还在 vs 2008 中包含 lib 文件【参考方案2】:

有两种截然不同的动态链接库:隐式链接和显式链接。

简而言之,隐式链接是在编译时链接的。您需要一个导入库来链接(.lib)、带有函数原型的头文件以及正确使用 dllexport 和 dllexport 或使用 .def 文件。 在这种情况下,dllexport/dllexport 更易于使用。系统负责加载库 (DLL)。

显式链接是运行时链接。您不需要任何导入库或标题。您需要知道什么是函数签名。您必须显式调用 LoadLibrary 和 GetProcAddress 才能调用该函数。

要查看如何正确创建用于导出/导入的宏,请创建空的 Win32 项目,选择 DLL 并确保选中导出符号复选框。 在主头文件中,您将看到如何使用宏进行导入/导出的说明。

【讨论】:

以上是关于构造函数重载类获取链接器错误使用DLL?的主要内容,如果未能解决你的问题,请参考以下文章

派生类中的重载构造函数

C++list类模拟实现

C++类-构造函数的重载

C++类-构造函数的重载

list模拟实现

list模拟实现