你如何“解码”Visual Studio链接错误?

时间:2009-04-08 16:07:44

标签: c++ linker

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

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

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

  

testproj错误LNK2019:未解决   外部符号“public:__ thiscall   谷歌:: protobuf的内部:: :: GeneratedMessageReflection :: GeneratedMessageReflection(类   google :: protobuf :: Descriptor const   *,类google :: protobuf ::消息const *,int const *   常量,INT,INT,INT,类   google :: protobuf :: DescriptorPool const   *,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)

2 个答案:

答案 0 :(得分:5)

符号是函数名称的“受损”版本。基本上是因为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

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

答案 1 :(得分:2)

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

通常很简单,弄清楚如何解决这些链接器错误。错误消息告诉您确切需要知道的内容:

  

谷歌:: protobuf的::内部::的 GeneratedMessageReflection :: GeneratedMessageReflection (类   google :: protobuf :: Descriptor const   *,类google :: protobuf ::消息const *,int const *   常量,INT,INT,INT,类   google :: protobuf :: DescriptorPool const   *,INT)“

这看起来像是在谷歌库中使用名为“GeneratedMessageReflection”的类。找出哪个库提供了这个类,然后进入编译器链接器设置&在该库的LIB文件中添加“附加引用”。