Как считать подробный VC ++, компоновщик произвел

Пытаясь отладить некоторые ошибки компоновщика, я включил / ПОДРОБНЫЙ, и я пытаюсь понять вывод. Мне приходит в голову, что я действительно не знаю, как считать его.

Например:

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? Кажется маловероятным.

Так в основном я надеюсь дешифровать базовый порядок в операции компоновщика.

8
задан Kate Gregory 19 May 2010 в 19:12
поделиться

1 ответ

Поиск символов для ссылки начинается с точки входа вашего приложения (основной или WinMain). Оттуда компоновщик получает все символы, от которых зависит точка входа, загружает их собственные зависимости и так далее, пока не останется никаких зависимостей.

В старых компоновщиках любой .obj, включенный в основной проект, обязательно должен быть связан, и поэтому их зависимости должны присутствовать в проекте, чтобы ссылка была успешной. Сегодня большинство компоновщиков удаляют код, который никогда не использовался, даже если он содержится в явно связанных файлах obj.

О 1> Обработано /DEFAULTLIB:libgslcblasMD.lib: это просто означает, что файл библиотеки был просканирован, и его символы были добавлены в словарь, чтобы впоследствии использовать его для разрешения зависимостей.

Порядок, в котором происходит разрешение, не обязательно имеет какое-либо отношение к порядку, в котором обрабатываются файлы библиотеки. Когда компоновщик обрабатывает библиотеку, он просто добавляет свои символы в словарь. Разрешение зависимостей выполняется после того, как этот словарь был заполнен, начиная с основной точки входа, как я упоминал выше.

5
ответ дан 5 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: