2009-04-08 2 views
5

Я не очень опытен в C++, и когда мне приходится работать с другой библиотекой, и я получаю ошибки связи, я полностью в темноте от того, что компилятор пытается мне рассказать (кроме того, что он не может найти что-то ссылка где-то).Как вы «декодируете» ошибки связи Visual Studio?

Есть ли хорошие ссылки, которые подробно описывают значение символов и символов в сообщении об ошибке ссылки? Или как бороться с такими ошибками?

Например, это ошибка линковки я получил недавно:

ошибка testproj LNK2019: неразрешенный внешний символ «общественность: __thiscall Google :: Protobuf :: Внутренняя :: GeneratedMessageReflection :: GeneratedMessageReflection (класс google :: protobuf :: Descriptor const *, класс google :: protobuf :: Message const *, int const * const, int, int, int, класс google :: protobuf :: DescriptorPool const *, int) "(?? 0GeneratedMessageReflection @ internal @ protobuf @ google @@ QAE @ PBVDescriptor @ 23 @ PBVMessage @ 23 @ QBHHHHPB VDescriptorPool @ 23 @ H @ Z) ссылки в функции "аннулируются __cdecl testproj :: protobuf_BuildDesc_def_2eproto_AssignGlobalDescriptors (класс Google :: Protobuf :: FileDescriptor Const *)" (? Protobuf_BuildDesc_def_2eproto_AssignGlobalDescriptors @ testproj @@ YAXPBVFileDescriptor @ Protobuf @ Google @@@ Z)

ответ

4

Символы - это «искаженные» версии имен функций. В основном из-за перегрузки 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) 

[email protected]@[email protected]@@[email protected]@[email protected]@[email protected]@[email protected]@Z) 

- это одно и то же, только более поздняя версия искалечена.

Обратите внимание, что искаженная версия начинается с:

[email protected]@[email protected] 

, который соответствует хорошо с:

google::protobuf::internal::GeneratedMessageReflection 

Поскольку первые несколько строк дадут вам необходимую информацию, вы можете в значительной степени игнорировать подогнанную версию , Текстовых версий подписей достаточно, чтобы исправить ошибку компоновщика.

+0

Вижу. Есть ли настройка в визуальной студии, чтобы скрыть исковерканную версию? – scottm

+0

какую версию визуальной студии вы используете? –

+0

Я переключаюсь между 2003 и 2008 годами – scottm

2

Unresolved externals означает, что вы пытаетесь вызвать функцию в другой DLL, но вы не связаны с этим LIB-файлом библиотеки DLL.

Обычно довольно просто выяснить, как решить эти ошибки компоновщика. Сообщение об ошибке говорит вам именно то, что вам нужно знать:

Google :: Protobuf :: Внутренняя :: GeneratedMessageReflection :: GeneratedMessageReflection (класс Google :: Protobuf :: Дескриптор Const *, класс Google: : Protobuf :: Message сопз *, внутр сопз * Const, Int, Int, Int, класс Google :: Protobuf :: DescriptorPool Const *, Int)»

Это выглядит, как вы пытаетесь использовать класс под названием «GeneratedMessageReflection» в библиотеке google. t, что библиотека предоставляет этот класс, а затем перейдите к настройкам компоновщика компиляторов & добавьте «Дополнительный справочник» к файлу LIB этой библиотеки.

+0

Я сделал это (добавлен каталог .lib-файла в «Дополнительные библиотечные каталоги»), может ли это означать, что проблема связана с библиотекой? Или, есть ли другой способ ссылаться на библиотеку, о которой я не знаю? – scottm

 Смежные вопросы

  • Нет связанных вопросов^_^