Пытаясь отладить некоторые ошибки компоновщика, я включил / VERBOSE и пытаюсь понять вывод. Мне приходит в голову, что я действительно не знаю, как это читать.
Например:
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 " (??BBox2d@Geometry@VisionMap@@QBE?AVBox2DInt@12@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>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 " (??BBox2d@Geometry@VisionMap@@QBE?AVBox2DInt@12@XZ)
1> Referenced in FocusDlg.obj
1> Loaded geometry.lib(Box2d.obj)
Он пытается найти реализацию вышеуказанного оператора, который используется где-то в FocusDlg.cpp, и находит его в geometry.lib.
Но что значит 1>Processed /DEFAULTLIB:libgslcblasMD.lib
? От чего зависит порядок разрешения символов? Почему он загружает этот конкретный символ при обработке libgslcblasMD.lib
, который является сторонней библиотекой? Или я неправильно читаю?
Кажется, что компоновщик просматривает символы, указанные в различных объектных файлах проекта, но я не знаю, в каком порядке. Затем он ищет статические библиотеки, которые использует проект - по ссылке на проект, явному импорту и автоматическому импорту библиотек по умолчанию; но это происходит в том порядке, который мне снова кажется произвольным.
Когда он находит символ, например, в geometry.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 " (??BBox2d@Geometry@VisionMap@@QBE?AVBox2DInt@12@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)" (??0Box2DInt@Geometry@VisionMap@@QAE@HHHH@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)" (??1Point3d@Geometry@VisionMap@@UAE@XZ)
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)" (??$serialize@Vbinary_oarchive@archive@boost@@@Geometry@VisionMap@@YAXAAVbinary_oarchive@archive@boost@@AAVPoint3d@01@I@Z)
1> Referenced in GPSFrm.obj
1> Referenced in MainFrm.obj
1> Loaded geometry.lib(GeometrySerializationImpl.obj)
Но затем, по какой-то причине, он продолжает находить символы, которые определены в других библиотеках, и позже возвращается к геометрии (куча раз).
Очевидно, что он не выполняет «просмотр геометрии и загрузку каждого символа, на который есть ссылки в проекте, а затем переход к другим библиотекам». Но мне не ясно, что является порядком поиска символов.
А как обстоят дела со всеми этими библиотеками, обрабатываемыми в начале работы компоновщика, но не находящими каких-либо символов для загрузки из них? Разве этот проект не использует ничего из msvcrt.lib
, kernel32.lib
? Кажется маловероятным.
Так что в основном я хочу расшифровать базовый порядок в операции компоновщика.