Пытаясь отладить некоторые ошибки компоновщика, я включил / ПОДРОБНЫЙ, и я пытаюсь понять вывод. Мне приходит в голову, что я действительно не знаю, как считать его.
Например:
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, это затем продолжает находить набор других символов от того же 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
? Кажется маловероятным.
Так в основном я надеюсь дешифровать базовый порядок в операции компоновщика.
Поиск символов для ссылки начинается с точки входа вашего приложения (основной или WinMain). Оттуда компоновщик получает все символы, от которых зависит точка входа, загружает их собственные зависимости и так далее, пока не останется никаких зависимостей.
В старых компоновщиках любой .obj, включенный в основной проект, обязательно должен быть связан, и поэтому их зависимости должны присутствовать в проекте, чтобы ссылка была успешной. Сегодня большинство компоновщиков удаляют код, который никогда не использовался, даже если он содержится в явно связанных файлах obj.
О 1> Обработано /DEFAULTLIB:libgslcblasMD.lib
: это просто означает, что файл библиотеки был просканирован, и его символы были добавлены в словарь, чтобы впоследствии использовать его для разрешения зависимостей.
Порядок, в котором происходит разрешение, не обязательно имеет какое-либо отношение к порядку, в котором обрабатываются файлы библиотеки. Когда компоновщик обрабатывает библиотеку, он просто добавляет свои символы в словарь. Разрешение зависимостей выполняется после того, как этот словарь был заполнен, начиная с основной точки входа, как я упоминал выше.