【问题标题】:How to read verbose VC++ linker output如何读取详细的 VC++ 链接器输出
【发布时间】:2011-02-20 11:49:30
【问题描述】:

为了调试一些链接器错误,我打开了 /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 是什么意思?什么决定了符号解析的顺序?为什么在处理第 3 方库 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.libkernel32.lib 的任何东西吗?似乎不太可能。

所以基本上我希望破译链接器操作中的底层顺序。

【问题讨论】:

    标签: c++ visual-c++ linker


    【解决方案1】:

    搜索要链接的符号从您的应用入口点(main 或 WinMain)开始。链接器从那里获取入口点所依赖的所有符号,加载它们自己的依赖项,等等,直到没有剩下的依赖项。

    在较旧的链接器中,主项目中包含的任何 .obj 都必须被链接,因此它们的依赖项应该存在于项目中以使链接成功。今天,大多数链接器会删除从未使用过的代码,即使它包含在显式链接的 obj 文件中。

    关于1&gt;Processed /DEFAULTLIB:libgslcblasMD.lib:这仅表示已扫描库文件,并将其符号附加到字典中,以便稍后将其用于依赖关系解析。

    解析发生的顺序不一定与处理库文件的顺序有任何关系。当链接器处理一个库时,它只是将其符号添加到字典中。依赖关系解析是在填充该字典后进行的,从主入口点开始,如上所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2011-05-28
      • 2021-02-24
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多