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.