尽管链接到带有导​​出符号的 .lib 文件,但从托管 C++ 链接到非托管 C++ 时出现链接错误

Posted

技术标签:

【中文标题】尽管链接到带有导​​出符号的 .lib 文件,但从托管 C++ 链接到非托管 C++ 时出现链接错误【英文标题】:Link error linking from managed to unmanaged C++ despite linking to .lib file with exported symbols 【发布时间】:2012-07-17 22:23:06 【问题描述】:

尽管关注了各种关于从 C++/CLI 包装器 dll 使用和链接到非托管 C++ 代码的帖子,但我无法解决这些链接问题。

1>MyClassAdapter.obj : error LNK2028: unresolved token (0A00000A) "public: __thiscall MyClass::~MyClass(void)" (??1MyClass@@$$FQAE@XZ) referenced in function "public: void * __thiscall MyClass::`scalar deleting destructor'(unsigned int)" (??_GMyClass@@$$FQAEPAXI@Z)
1>MyClassAdapter.obj : error LNK2028: unresolved token (0A00000B) "public: __thiscall MyClass::MyClass(void)" (??0MyClass@@$$FQAE@XZ) referenced in function "public: __clrcall WrapperLayer::MyClassAdaptor::MyClassAdaptor(void)" (??0MyClassAdaptor@WrapperLayer@@$$FQ$AAM@XZ)
1>MyClassAdapter.obj : error LNK2019: unresolved external symbol "public: __thiscall MyClass::MyClass(void)" (??0MyClass@@$$FQAE@XZ) referenced in function "public: __clrcall WrapperLayer::MyClassAdaptor::MyClassAdaptor(void)" (??0MyClassAdaptor@WrapperLayer@@$$FQ$AAM@XZ)
1>MyClassAdapter.obj : error LNK2019: unresolved external symbol "public: __thiscall MyClass::~MyClass(void)" (??1MyClass@@$$FQAE@XZ) referenced in function "public: void * __thiscall MyClass::`scalar deleting destructor'(unsigned int)" (??_GMyClass@@$$FQAEPAXI@Z)

我有一个带有简单类的非托管本机 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),它链接到 Linker->Input->Additional Dependencies 设置中的 MyClass.lib。在包装项目中还包含了来自 MyClass 的 .h 文件,我可以看到 sln 可以看到 MyClass.h 文件。

// MyClassAdaptor.h

#include "MyClass.h"

namespace WrapperLayer

    public ref class MyClassAdaptor 
     
      . . . 
    private:
        MyClass* _myclass;  
    ; 

可能缺少什么?

【问题讨论】:

非托管代码也是用 VC++ 2010 构建的吗? 所以,愚蠢的问题,但是...您实际上已经实现构造函数和析构函数,对吧? 是的,我为 MyClass 和 MyClassWrapper 都做过。编译器会不会只看到 MyClass.lib 而看不到 MyClass.dll? 【参考方案1】:

几点:

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

【讨论】:

非常感谢!!依赖沃克太棒了!这确实是由于 32 位/64 位不匹配,因为我使用 Cmake 为 MyClass 生成 sln/project 文件并选择了不匹配的版本。如果没有 Dependency Walker,我将无法判断。

以上是关于尽管链接到带有导​​出符号的 .lib 文件,但从托管 C++ 链接到非托管 C++ 时出现链接错误的主要内容,如果未能解决你的问题,请参考以下文章

无法解析的外部符号

Windows MSVC 符号表(.lib文件)(C++符号表解析)(符号表是如何产生的)(第四步:链接)

/sbin/ldconfig.real:/usr/lib/ 不是符号链接(整个文件夹)

/usr/local/lib 中缺少符号链接

为啥尽管源代码没有变化,但从一个系统到另一个系统的片段数量却有很大差异?

尽管静态链接,但未找到 DLL