Как читать подробный вывод компоновщика VC ++ - PullRequest
8 голосов
/ 17 мая 2010

Пытаясь отладить некоторые ошибки компоновщика, я включил / 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? Кажется маловероятным.

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

1 Ответ

5 голосов
/ 18 мая 2010

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

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

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

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

...