2010-05-17 11 views
8

Al intentar depurar algunos errores del enlazador, encendí/VERBOSE y trato de dar sentido a la salida. Se me ocurre que realmente no sé cómo leerlo.Cómo leer el resultado del enlazador VC++ detallado

Por ejemplo:

1>Compiling version info 
1>Linking... 
1>Starting pass 1 
1>Processed /DEFAULTLIB:mfc80.lib 
1>Processed /DEFAULTLIB:mfcs80.lib 
1>Processed /DEFAULTLIB:msvcrt.lib 
1>Processed /DEFAULTLIB:kernel32.lib 
1>Processed /DEFAULTLIB:user32.lib 
.... 
1>Processed /DEFAULTLIB:libgslcblasMD.lib 
1>Searching libraries 
1> Searching V:\Src\Solutions\\..\..\\Common\Win32\Lib\PlxApi.lib: 
1> Searching ..\..\..\..\out\win32\release\lib\camerageometry.lib: 
1> Searching ..\..\..\..\out\win32\release\lib\geometry.lib: 
1>  Found "public: __thiscall VisionMap::Geometry::Box2d::operator class VisionMap::Geometry::Box2DInt(void)const " ([email protected]@[email protected]@[email protected]@XZ) 
1>  Referenced in FocusDlg.obj 
1>  Loaded geometry.lib(Box2d.obj) 
1>Processed /DEFAULTLIB:CGAL-vc80-mt.lib 
1>Processed /DEFAULTLIB:boost_thread-vc80-mt-1_33_1.lib 

lo que está pasando aquí?

Creo que entiendo este bit:

1>Processed /DEFAULTLIB:libgslcblasMD.lib 
1>Searching libraries 
1> Searching V:\Src\Solutions\\..\..\\Common\Win32\Lib\PlxApi.lib: 
1> Searching ..\..\..\..\out\win32\release\lib\camerageometry.lib: 
1> Searching ..\..\..\..\out\win32\release\lib\geometry.lib: 
1>  Found "public: __thiscall VisionMap::Geometry::Box2d::operator class VisionMap::Geometry::Box2DInt(void)const " ([email protected]@[email protected]@[email protected]@XZ) 
1>  Referenced in FocusDlg.obj 
1>  Loaded geometry.lib(Box2d.obj) 

Está tratando de encontrar la aplicación del operador anterior, que se utiliza en algún lugar de FocusDlg.cpp, y se lo encuentra en geometry.lib.

¿Pero qué significa 1>Processed /DEFAULTLIB:libgslcblasMD.lib? ¿Qué determina el orden de resolución del símbolo? ¿Por qué está cargando este símbolo en particular al procesar libgslcblasMD.lib que es una biblioteca de terceros? ¿O lo estoy leyendo mal?

Parece que el enlazador está pasando por los símbolos a los que se hace referencia en los diversos archivos de objetos del proyecto, pero no tengo idea en qué orden. A continuación, busca en las bibliotecas estáticas que utiliza el proyecto, por referencia de proyecto, importación explícita e importación automática de biblioteca predeterminada; pero lo hace en un orden que, de nuevo, me parece arbitrario.

cuando encuentra un símbolo, por ejemplo, en geometry.lib, entonces se sigue encontrando un montón de otros símbolos de la misma lib:

1> Searching V:\Src\Solutions\\..\..\\Common\Win32\Lib\PlxApi.lib: 
1> Searching ..\..\..\..\out\win32\release\lib\camerageometry.lib: 
1> Searching ..\..\..\..\out\win32\release\lib\geometry.lib: 
1>  Found "public: __thiscall VisionMap::Geometry::Box2d::operator class VisionMap::Geometry::Box2DInt(void)const " ([email protected]@[email protected]@[email protected]@XZ) 
1>  Referenced in FocusDlg.obj 
1>  Loaded geometry.lib(Box2d.obj) 
1>Processed /DEFAULTLIB:CGAL-vc80-mt.lib 
1>Processed /DEFAULTLIB:boost_thread-vc80-mt-1_33_1.lib 
1>  Found "public: __thiscall VisionMap::Geometry::Box2DInt::Box2DInt(int,int,int,int)" ([email protected]@[email protected]@[email protected]@Z) 
1>  Referenced in FocusDlg.obj 
1>  Referenced in ImageView.obj 
1>  Referenced in geometry.lib(Box2d.obj) 
1>  Loaded geometry.lib(Box2DInt.obj) 
1>  Found "public: virtual __thiscall VisionMap::Geometry::Point3d::~Point3d(void)" ([email protected]@[email protected]@[email protected]) 
1>  Referenced in GPSFrm.obj 
1>  Referenced in MainFrm.obj 
1>  Loaded geometry.lib(Point3d.obj) 
1>  Found "void __cdecl VisionMap::Geometry::serialize<class boost::archive::binary_oarchive>(class boost::archive::binary_oarchive &,class VisionMap::Geometry::Point3d &,unsigned int)" ([email protected][email protected]@[email protected]@@[email protected]@@[email protected]@[email protected]@[email protected]@[email protected]) 
1>  Referenced in GPSFrm.obj 
1>  Referenced in MainFrm.obj 
1>  Loaded geometry.lib(GeometrySerializationImpl.obj) 

Pero entonces, por alguna razón, se pasa a encuentre símbolos que están definidos en otras librerías, y luego regresa a la geometría (un montón de veces).

Así que, claramente, no se trata de "buscar en la geometría y cargar todos los símbolos que son referencias en el proyecto, y luego continuar a otras bibliotecas". Pero no está claro para mí qué es el orden de búsqueda de símbolos.

¿Y cuál es el problema con todas esas bibliotecas que se procesan al comienzo del trabajo del vinculador, pero que no encuentran ningún símbolo para cargarlas? ¿Este proyecto realmente no usa nada de msvcrt.lib, kernel32.lib? Parece poco probable.

Básicamente, estoy tratando de descifrar el orden subyacente en el funcionamiento del enlazador.

Respuesta

5

La búsqueda de símbolos para vincular comienza en el punto de entrada de la aplicación (principal o WinMain). A partir de ahí, el enlazador obtiene todos los símbolos de los que depende el punto de entrada, carga sus propias dependencias, y así sucesivamente, hasta que no queden dependencias.

En los vinculadores anteriores, cualquier .obj incluido en el proyecto principal estaría necesariamente vinculado, por lo que sus dependencias deberían estar presentes en el proyecto para que el enlace tenga éxito. Hoy en día, la mayoría de los vinculadores eliminan el código que nunca se usa, incluso cuando está contenido en archivos obj explícitamente vinculados.

Acerca de 1>Processed /DEFAULTLIB:libgslcblasMD.lib: esto simplemente significa que se escaneó el archivo de la biblioteca y sus símbolos se anexaron a un diccionario para usarlo más adelante para la resolución de dependencias.

El orden en que se produce la resolución no tiene necesariamente relación con el orden en que se procesan los archivos de la biblioteca. Cuando el enlazador procesa una lib simplemente agrega sus símbolos al diccionario.La resolución de dependencias se realiza después de que ese diccionario se haya rellenado, comenzando en el punto de entrada principal, como mencioné anteriormente.

Cuestiones relacionadas