尽管链接到.lib文件与导出符号

问题描述:

尽管以下关于使用和链接到来自C++/CLI包装DLL的非托管C++代码的各种帖子,我无法解决这些链接问题,从托管到非托管C++链接错误。尽管链接到.lib文件与导出符号

1>MyClassAdapter.obj : error LNK2028: unresolved token (0A00000A) "public: __thiscall MyClass::~MyClass(void)" ([email protected]@[email protected]) referenced in function "public: void * __thiscall MyClass::`scalar deleting destructor'(unsigned int)" ([email protected]@[email protected]) 
1>MyClassAdapter.obj : error LNK2028: unresolved token (0A00000B) "public: __thiscall MyClass::MyClass(void)" ([email protected]@[email protected]) referenced in function "public: __clrcall WrapperLayer::MyClassAdaptor::MyClassAdaptor(void)" ([email protected]@@[email protected]) 
1>MyClassAdapter.obj : error LNK2019: unresolved external symbol "public: __thiscall MyClass::MyClass(void)" ([email protected]@[email protected]) referenced in function "public: __clrcall WrapperLayer::MyClassAdaptor::MyClassAdaptor(void)" ([email protected]@@[email protected]) 
1>MyClassAdapter.obj : error LNK2019: unresolved external symbol "public: __thiscall MyClass::~MyClass(void)" ([email protected]@[email protected]) referenced in function "public: void * __thiscall MyClass::`scalar deleting destructor'(unsigned int)" ([email protected]@[email protected]) 

我有一个非托管的本机C++的dll用一个简单的类,因此导出/导入符号

// MyClass.h 
#ifdef _EXPORTING 
    #define DLL_PUBLIC __declspec(dllexport) 
#else 
    #define DLL_PUBLIC __declspec(dllimport) 
#endif 

class DLL_PUBLIC MyClass { . . . }; 

我能看到的.dll和建成后产生的.lib连接文件。

然后,我有托管的C++/CLI包装器项目(也是一个dll),该项目链接到链接器 - >输入 - >附加依赖项设置中的MyClass.lib。还在包装器项目中包含MyClass的.h文件,我可以看到sln可以看到MyClass.h文件。

// MyClassAdaptor.h 

#include "MyClass.h" 

namespace WrapperLayer 
{ 
    public ref class MyClassAdaptor 
    { 
     . . . 
    private: 
     MyClass* _myclass; 
    }; 
} 

什么可能会丢失?

+0

使用VC++ 2010构建的非托管代码也是如此吗? – ildjarn 2012-07-17 22:26:57

+0

是的,这两个DLL都是。 – 2012-07-17 22:28:28

+0

所以,愚蠢的问题,但是......你实际上*实现了构造函数和析构函数,对吧? – 2012-07-17 22:37:40

几点:

  • 使用的Dependency Walker为DLL并检查这些符号实际上是DLL。
  • 确保您使用的是正确的lib文件--32位LIB不能用于64位版本。
  • 确保用于构建类的.CPP文件实际上是非托管的(或者整个DLL本身是非托管的)。
+0

非常感谢!依赖沃克真棒!这确实是由于32位/ 64位不匹配,因为我使用Cmake为MyClass生成sln/project文件并选择了不匹配的版本。如果没有Dependency Walker,我无法分辨。 – 2012-07-18 15:19:17