2009-04-08 13 views
5

No tengo mucha experiencia en C++, y cuando tengo que trabajar con otra biblioteca y obtengo errores en los enlaces, estoy completamente a oscuras sobre lo que el compilador intenta decirme (aparte de que no puede encontrarlo) algo de referencia en alguna parte).¿Cómo se "decodifican" los errores de Visual Studio Link?

¿Existen buenos enlaces que describen, en detalle, el significado de los símbolos y caracteres en un mensaje de error de enlace? ¿O cómo solucionar problemas de tales errores?

Por ejemplo, se trata de un error de enlace que he recibido recientemente:

LNK2019 de error TestProj: sin resolver símbolo externo "público: __thiscall Google :: :: protobuf interna :: :: GeneratedMessageReflection GeneratedMessageReflection (clase google :: :: protobuf descriptor const * , clase google :: const protobuf :: Mensaje *, const int * const , int, int, int, clase google :: :: protobuf DescriptorPool const *, int) "(?? 0GeneratedMessageReflection @ internal @ protobuf @ google @@ QAE @ PBVDescriptor @ 23 @ PBVMessage @ 23 @ QBHHHHPB VDescriptorPool @ 23 @ H @ Z) referencia en función de "vacío __cdecl TestProj :: protobuf_BuildDesc_def_2eproto_AssignGlobalDescriptors (Google clase :: :: protobuf FileDescriptor const *)" (? Protobuf_BuildDesc_def_2eproto_AssignGlobalDescriptors @ TestProj @@ YAXPBVFileDescriptor @ protobuf @ google @@@ Z)

Respuesta

4

Los símbolos son las versiones "destrozadas" de los nombres de las funciones. Básicamente debido a la sobrecarga de C++ (2 funciones con diferentes firmas pueden tener el mismo nombre). La información de la firma está codificada en el nombre.

El mensaje que pegó tiene ambos las versiones codificadas y de texto sin formato.

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) 

son lo mismo, solo que el último está mutilado.

en cuenta que la versión mutilada comienza con:

[email protected]@[email protected] 

que se corresponde muy bien con:

google::protobuf::internal::GeneratedMessageReflection 

Debido a que las primeras líneas le dan la información pertinente, se puede casi ignorar las versiones destrozados . Las versiones de texto sin formato de las firmas son suficientes para corregir el error del vinculador.

+0

Ya veo. ¿Hay alguna configuración en Visual Studio para ocultar la versión destrozada? – scottm

+0

¿qué versión de Visual Studio estás usando? –

+0

Cambio entre 2003 y 2008 – scottm

2

Externos no resueltos significa que está tratando de llamar a una función en otra DLL, pero no ha vinculado al archivo LIB de esa DLL.

Por lo general, es bastante simple averiguar cómo resolver estos errores del enlazador. El mensaje de error que dice exactamente lo que necesita saber:

Google :: protobuf :: :: interna GeneratedMessageReflection :: GeneratedMessageReflection (clase Google :: :: protobuf descriptor const * , clase Google: : protobuf :: Mensaje const *, const int * const , int, int, int, clase Google :: :: protobuf DescriptorPool const *, int)"

Esto parece que está intentando utilizar una clase llamada "GeneratedMessageReflection" en una biblioteca de google. Encuentra tu t qué biblioteca proporciona esta clase y luego ingrese a la configuración del vinculador de compiladores & agregue una "Referencia adicional" al archivo LIB de esa biblioteca.

+0

He hecho eso (agregué el directorio del archivo .lib a "Directorios Adicionales de la Biblioteca"), ¿podría eso significar que hay un problema con la biblioteca? O bien, ¿hay alguna otra manera de hacer referencia a la biblioteca que yo no sepa? – scottm

Cuestiones relacionadas