【问题标题】:How do you "decode" Visual Studio Link Errors?你如何“解码”Visual Studio 链接错误?
【发布时间】:2009-04-08 16:07:43
【问题描述】:

我在 C++ 方面不是很有经验,当我必须使用另一个库并且遇到链接错误时,我完全不知道编译器试图告诉我什么(除了它不能在某处找到参考资料)。

是否有任何好的链接可以详细描述链接错误消息中符号和字符的含义?或者如何解决此类错误?

例如,这是我最近收到的链接错误:

testproj 错误 LNK2019:未解决 外部符号“公共:__thiscall google::protobuf::internal::GeneratedMessageReflection::GeneratedMessageReflection(类 google::protobuf::Descriptor 常量 *,class google::protobuf::Message const *,int const * 常量,整数,整数,整数,类 google::protobuf::DescriptorPool 常量 *,int)" (??0GeneratedMessageReflection@internal@protobuf@google@@QAE@PBVDescriptor@23@PBVMessage@23@QBHHHHPBVDescriptorPool@23@H@Z) 在函数“void __cdecl”中引用 testproj::protobuf_BuildDesc_def_2eproto_AssignGlobalDescriptors(类 google::protobuf::FileDescriptor const *)" (?protobuf_BuildDesc_def_2eproto_AssignGlobalDescriptors@testproj@@YAXPBVFileDescriptor@protobuf@google@@@Z)

【问题讨论】:

    标签: c++ linker


    【解决方案1】:

    符号是函数名称的“错位”版本。基本上是因为 c++ 重载(具有不同签名的 2 个函数可以具有相同的名称)。签名信息被编码到名称中。

    您粘贴的消息有编码和纯文本版本。

    public: __thiscall google::protobuf::internal::GeneratedMessageReflection::GeneratedMessageReflection(class google::protobuf::Descriptor const *,class google::protobuf::Message const *,int const * const,int,int,int,class google::protobuf::DescriptorPool const *,int)
    
    ?0GeneratedMessageReflection@internal@protobuf@google@@QAE@PBVDescriptor@23@PBVMessage@23@QBHHHHPBVDescriptorPool@23@H@Z)
    

    都是一样的东西,只是后者被破坏了。

    注意修改后的版本以:

    ?0GeneratedMessageReflection@internal@protobuf@google
    

    很好地对应:

    google::protobuf::internal::GeneratedMessageReflection
    

    因为前几行为您提供了相关信息,您几乎可以忽略损坏的版本。签名的纯文本版本足以修复链接器错误。

    【讨论】:

    • 我明白了。 Visual Studio 中是否有隐藏损坏版本的设置?
    • 你用的是什么版本的visual studio?
    • 我在 2003 年和 2008 年之间切换
    • 不确定是否有办法抑制损坏的版本。但它们很容易被过滤掉。请仔细阅读并忽略所有带有@和?的条目。
    • 您的所有错误实际上是在说“找不到在名为 'protobuf_BuildDesc_def_2eproto_AssignGlobalDescriptors' 的函数中使用的函数 'GeneratedMessageReflection'”
    【解决方案2】:

    未解析的外部意味着您正在尝试调用另一个 DLL 中的函数,但您尚未链接到该 DLL 的 LIB 文件。

    弄清楚如何解决这些链接器错误通常非常简单。错误消息准确地告诉您需要了解的内容:

    google::protobuf::internal::GeneratedMessageReflection::GeneratedMessageReflection(类 google::protobuf::Descriptor 常量 *,class google::protobuf::Message const *,int const * 常量,整数,整数,整数,类 google::protobuf::DescriptorPool 常量 *,int)"

    这看起来像您正在尝试在 google 库中使用名为“GeneratedMessageReflection”的类。找出提供此类的库,然后进入您的编译器链接器设置并向该库的 LIB 文件添加“附加参考”。

    【讨论】:

    • 我已经做到了(将 .lib 文件的目录添加到“附加库目录”中),这是否意味着库有问题?或者,有没有其他方法可以引用我不知道的库?
    猜你喜欢
    • 2010-10-31
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    相关资源
    最近更新 更多