尽管链接到.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;
};
}
什么可能会丢失?
答
几点:
- 使用的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
使用VC++ 2010构建的非托管代码也是如此吗? – ildjarn 2012-07-17 22:26:57
是的,这两个DLL都是。 – 2012-07-17 22:28:28
所以,愚蠢的问题,但是......你实际上*实现了构造函数和析构函数,对吧? – 2012-07-17 22:37:40