2010-05-17 14 views
8

Bazı bağlayıcı hatalarının hatalarını ayıklamaya çalışıyorum, ben/VERBOSE'u açtım ve çıktıyı anlamaya çalışıyorum. Bana bunu nasıl okuyacağımı bilmiyorum. ÖrneğinVB ++ bağlantı noktası çıktısı nasıl okunur?

:

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 " ([email protected]@[email protected]@[email protected]@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 

Burada neler oluyor? FocusDlg.cpp yerde kullanılır yukarıdaki operatörü uygulanmasını bulmaya çalışıyor

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 " ([email protected]@[email protected]@[email protected]@XZ) 
1>  Referenced in FocusDlg.obj 
1>  Loaded geometry.lib(Box2d.obj) 

ve geometry.lib bulur:

Ben bu biraz anlıyorum.

1>Processed /DEFAULTLIB:libgslcblasMD.lib ne anlama geliyor? Sembol çözünürlüğünün sırasını ne belirler? 3. taraf kitaplığı olan libgslcblasMD.lib işlenirken neden bu belirli sembolü yüklüyor? Yoksa yanlış mı okuyorum?

Linker, projenin çeşitli nesne dosyalarında atıfta bulunulan sembollerden geçiyor gibi görünüyor, ancak hangi sırayla hiçbir fikrim yok. Daha sonra projenin kullandığı statik kütüphaneleri arar - proje referansı, açık ithalat ve otomatik varsayılan kütüphane ithalatı; ama yine de, bana göre keyfi görünüyor.

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 " ([email protected]@[email protected]@[email protected]@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)" ([email protected]@[email protected]@[email protected]@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)" ([email protected]@[email protected]@[email protected]) 
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)" ([email protected][email protected]@[email protected]@@[email protected]@@[email protected]@[email protected]@[email protected]@[email protected]) 
1>  Referenced in GPSFrm.obj 
1>  Referenced in MainFrm.obj 
1>  Loaded geometry.lib(GeometrySerializationImpl.obj) 

Ama sonra, nedense, bu şekilde devam eder:

o geometry.lib örneğin, daha sonra aynı lib diğer sembollerin bir demet bulmak için bir sembol devam bulur

Diğer lib'lerde tanımlanan sembolleri bul ve daha sonra geometriye geri dön (birkaç kez).

Açıkçası, "geometriye bakıp, projede referans gösterilen her sembolü yükler ve sonra diğer kitaplıklara devam eder" yapmaz. Ancak, 'un sembolünün sırasının sırasının ne olduğu açık değil.

Ve tüm bu kütüphanelerin, linker işinin başında işlendiği, ancak onlardan yüklenecek herhangi bir sembol bulmadığı şey nedir? Bu proje gerçekten msvcrt.lib, kernel32.lib'dan herhangi bir şey kullanmıyor mu? Olası görünmüyor.

Temel olarak, linker'ın çalışmasında alttaki siparişi deşifre etmek istiyorum.

cevap

5

Bağlanacak sembollerin aramasında, uygulama giriş noktanız (ana veya WinMain) başlar. Buradan linker, giriş noktasının bağlı olduğu tüm sembolleri alır, bağımlılıklarını ve benzerlerini yükler, bağımlılık kalmayıncaya kadar.

Daha eski bağlayıcılarda, ana projeye dahil edilen herhangi bir .obj mutlaka bağlanır ve dolayısıyla bağlantının başarılı olması için projede bağımlılıkları bulunmalıdır. Bugün, çoğu bağlayıcı, açıkça bağlı olan obj dosyalarında yer alsa bile, hiç kullanılmamış olan kodu çıkarmaktadır.

Hakkında 1>Processed /DEFAULTLIB:libgslcblasMD.lib10: Bu yalnızca kitaplık dosyasının tarandığını ve sembollerin daha sonra bağımlılıklar çözümü için kullanmak üzere bir sözlüğe eklendiğini gösterir.

Çözünürlüğün oluştuğu sıra, mutlaka kitaplık dosyalarının işlendiği sırayla herhangi bir ilişki içinde değildir. Linker bir lib'i işlediğinde, sembollerini sadece sözlüğe ekler.Bağımlılıkların çözümü, söz konusu sözlükten sonra, yukarıda belirttiğim gibi ana giriş noktasından başlayarak yapılır.

İlgili konular