2010-05-17 9 views
8

कुछ लिंकर त्रुटियों को डीबग करने का प्रयास करते हुए, मैंने चालू/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 " ([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>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) 

यह ऊपर ऑपरेटर, जो 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 " ([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) 

लेकिन फिर भी, किसी कारण से, यह करने के लिए पर चला जाता है उन प्रतीकों को ढूंढें जो अन्य libs में परिभाषित हैं, और बाद में ज्यामिति पर लौटते हैं (समय का एक गुच्छा)।

तो स्पष्ट रूप से यह नहीं कर रहा है "ज्यामिति में देखने के लिए और इस परियोजना में हर प्रतीक है कि के संदर्भ लोड, और फिर अन्य पुस्तकालयों के लिए जारी"। लेकिन यह मुझे स्पष्ट नहीं है कि प्रतीक लुकअप का क्रम है।

और क्या उन सभी पुस्तकालयों लिंकर के काम की शुरुआत में कार्रवाई की जा रही है, लेकिन उनमें से लोड करने के लिए किसी भी प्रतीक नहीं मिल के साथ सौदा है? क्या यह परियोजना वास्तव में msvcrt.lib, kernel32.lib से कुछ भी उपयोग नहीं करती है? असंभव लगता है।

तो बुनियादी तौर पर मैं लिंकर के ऑपरेशन में अंतर्निहित आदेश को समझने के लिए देख रहा हूँ।

उत्तर

5

लिंक करने के लिए प्रतीकों के लिए खोज अपने अनुप्रयोग प्रवेश बिंदु (मुख्य, या WinMain) पर शुरू होता है। वहां से लिंकर उन सभी प्रतीकों को प्राप्त करता है जिन पर प्रवेश बिंदु निर्भर करता है, अपनी निर्भरता को लोड करता है, और इसी तरह, जब तक कोई निर्भरता नहीं छोड़ी जाती है।

पुराने लिंकर्स में, मुख्य परियोजना में शामिल किसी भी .obj को आवश्यक रूप से लिंक किया जाएगा, और इसलिए उनकी निर्भरता सफल होने के लिंक के लिए परियोजना में उपस्थित होना चाहिए। आज, अधिकांश लिंकर्स उस कोड को तोड़ते हैं जिसका उपयोग कभी नहीं किया जाता है, भले ही यह स्पष्ट रूप से लिंक की गई ओबीजे फाइलों में निहित हो।

लगभग 1>Processed /DEFAULTLIB:libgslcblasMD.lib: इसका मतलब यह है कि लाइब्रेरी फ़ाइल स्कैन की गई थी, और उसके प्रतीकों को बाद में निर्भरता संकल्प के लिए इसका उपयोग करने के लिए एक शब्दकोश में जोड़ा गया था।

जिसमें संकल्प होता है जरूरी जिस क्रम में पुस्तकालय फ़ाइलें संसाधित कर रहे हैं के लिए किसी भी संबंध नहीं है आदेश। जब लिंकर एक lib को संसाधित करता है तो यह बस इसके प्रतीकों को शब्दकोश में जोड़ता है।उपरोक्त वर्णित अनुसार, मुख्य प्रविष्टि बिंदु से शुरू होने के बाद, उस शब्दकोश के बाद निर्भरता संकल्प बनाया जाता है।

संबंधित मुद्दे