2012-08-24 17 views
6

को जोड़ने के बारे में पता होना चाहिए

विस्तार से कैसे काम करता है इस बारे में जानकारी दुर्लभ है। इसके अलावा आईडीई संकलन के विवरण को छुपाते हैं जो वास्तविक प्रोजेक्ट है जब आपके पास अपनी परियोजना के साथ कुछ लिंकिंग संबंधित समस्या है।प्रत्येक सी ++ डेवलपर को

आमतौर पर सी ++ पुस्तकों ने मुझे बताया कि

C++ code --> preprocessed c++ code --> object code 

लेकिन वे वास्तव में क्या एक औसत डेवलपर इस तथ्य के बावजूद जोड़ने, लिंकिंग त्रुटियों आम हैं के बारे में पता होना चाहिए पर बहुत अधिक विस्तार में जाने नहीं है। एक ताजा सी ++ प्रोग्रामर को कैसे पता होना चाहिए कि निम्न की तरह किसी त्रुटि से कैसे निपटें?

XmlRpcSocket.o:XmlRpcSocket.cpp:(.text+0x48b): undefined reference to `[email protected]' 

लेकिन यह प्रश्न विशेष रूप से इस समस्या के बारे में नहीं है (-lwsock32 इसे हल करता है)। समस्या जोड़ने के बारे में सामान्य ज्ञान की कमी है। मेरे विश्वविद्यालय सी ++ व्याख्याता ने एक स्लाइड के समय के लिए कुछ काले-बक्से के साथ जोड़ने के बारे में बात की।

इसके अलावा, लिंकिंग कार्यों के बारे में संसाधन दुर्लभ हैं और जिन लोगों को मैं जानता हूं उनमें से अधिकांश अभी भी ब्लैक-बॉक्स ऑपरेशन के रूप में जुड़ते हैं। जो मैंने लिंकिंग के बारे में सीखा है, वह प्रयोग के माध्यम से है, और थोड़े ने इसे "रास्ते में उठाया" है, लेकिन इस दृष्टिकोण के साथ समस्या यह है कि यह उत्तर देने से अधिक प्रश्न उठाती है।

उदाहरण के लिए: मुझे पता है .LIB फ़ाइलें लाइब्रेरी फ़ाइलें हैं जो ऑब्जेक्ट फ़ाइलों के बंडल हैं। अब, किसी को एक .LIB फ़ाइल का निर्माण और उपयोग कैसे करना चाहिए? इसका उपयोग करने के लिए वांछनीय कब है। LIB फ़ाइल? जब मैं स्थिर बना सकता हूं। एलआईबी फाइलें या डीएलएल का संदर्भ देने वाले लोग? जब मैं अपनी ऑब्जेक्ट फ़ाइलों के साथ एक .LIB फ़ाइल को लिंक करता हूं, तो क्या सबकुछ कॉपी हो जाता है, या केवल ऑब्जेक्ट फ़ाइलों का उपयोग करता है? मैं स्थिर रूप से जोड़ने के बजाय DLLs/तो फ़ाइलों को कब बनाना चाहिए? क्या मुझे सामान्य समस्याओं को हल करने के लिए ऑब्जेक्ट फ़ाइलों की आंतरिक संरचना के बारे में जानना है? मुझे नाम-उलझन के बारे में क्या पता होना चाहिए? यह कब प्रासंगिक है? क्या मैं अपने प्रोजेक्ट के साथ कई अलग-अलग मानक पुस्तकालयों को लिंक कर सकता हूं यदि डीएलएस में से एक पुराना msvcrt लोड करता है? आदि

सवाल

जाहिर है मैं एक ही बार में ऊपर दिए गए सभी सवालों का जवाब की उम्मीद नहीं है। मुझे बस यह जानने की जरूरत है कि कहां से शुरू करना है। क्या कोई संसाधन है जैसे "हर प्रोग्रामर को मेमोरी के बारे में क्या पता होना चाहिए", जो लिंक करने के बारे में बात करता है? इसलिए, मुझे संसाधनों की आवश्यकता है और आपकी अंतर्दृष्टि पर लिंकिंग प्रक्रिया के बारे में जानने के लिए मुझे किस दिशा में जाना चाहिए।

प्रत्येक डेवलपर को जोड़ने के बारे में क्या पता होना चाहिए?

+0

सी ++ भाषा वर्तमान में मॉड्यूल और पुस्तकालयों का समर्थन नहीं करती है, इसलिए इस तरह के समर्थन अक्सर कार्यान्वयन विशिष्ट भाषा एक्सटेंशन के साथ किया जाता है।विशिष्ट ऑपरेटिंग सिस्टम और कंपाइलर के लिए बेहतर प्रश्न पूछें। –

+0

जिस तरह से यह किया गया है वह पॉज़िक्स और विंडोज दोनों में बहुत समान है। आपके पास .lib/.a फ़ाइलें हैं। आपके पास .dll और .so फ़ाइलें हैं। आपके पास दोनों प्रणालियों पर _undefined संदर्भ_ त्रुटियां हैं। ऑब्जेक्ट फ़ाइल प्रारूप अलग हैं, लेकिन बहुत सी सामान्य जमीन है। यह सवाल लिंकिंग के बारे में आधिकारिक सी ++ दस्तावेज़ों के बारे में नहीं है, मुझे पता है कि मानक कहता है कि लिंकिंग _implementaion detail_ है। सी ++ दुनिया में जोड़ने के सामान्य प्रथाओं के बारे में। – Klaufir

+1

विंडोज़ में आपको '__declspec (dllexport)' जैसी चीजों को सी ++ कोड में लिखना पड़ सकता है, यूनिक्स में यह सही लिंकिंग का समर्थन करने के लिए '__attribute__ ((__visibility __ (" default ")) जैसे कुछ हो सकता है। –

उत्तर

2

संसाधनों के टन हैं।

मुझे लगता है कि एक "शुरुआत" के लिए भारी हो सकता है;)

जहां तक ​​"Windows", आप बदतर यहाँ शुरू करने के लिए की तुलना में कर सकता है:

मैं भी थाई की सिफारिश करता हूं रों:

'होप मदद करता है कि :)

पुनश्च:

स्पष्टीकरण के रूप में:

  • आप जानना चाहते हैं कि बिट्स आप' "संकलित" (मशीन कोड में) सभी "लिंकिंग" द्वारा एक साथ आते हैं। एक पूरी तरह से निष्पक्ष सवाल :)

  • यह भी कैसे कि मशीन कोड एक "चल रहा कार्यक्रम 'से संबंधित है के बारे में थोड़ा पता करने के लिए मदद करता है ...

  • ... और कैसे एक" चल रहे प्रोग्राम "कुछ का उपयोग करता है गतिशील क्रम से (स्थिर) .exe से बिट्स, और अन्य बिट्स (.dll के, या "गतिशील रूप से जुड़े हुए पुस्तकालयों)।

  • इन विवरणों के सभी अक्सर पूरी तरह से platform- और ओएस विशिष्ट हैं

  • इसलिए (विविध) लिंक।

फिर, मुझे आशा है कि यह आपके प्रारंभिक प्रश्न के साथ मदद करता है।

0

यदि आप प्रोग्रामिंग/सी ++ में शुरू कर रहे हैं, तो मैं एक स्थिर और गतिशील libs कैसे काम करता है और एक .dll और .lib बनाने के लिए कुछ ट्यूटोरियल बनाने की अच्छी समझ कर शुरू करूंगा। Google इसके लिए आपका सबसे अच्छा दोस्त है: मुझे बस यह उदाहरण के लिए मिलता है: http://www.bogotobogo.com/cplusplus/libraries.php

ध्यान दें कि जिस तरह से आप lib बनाते हैं, वह आपके सी ++ कंपाइलर पर निर्भर करता है। मेरे सिर के शीर्ष पर मेरे पास एक एकीकृत विकास वातावरण (आईडीई) है जैसे विजुअल स्टूडियो या gnu C++ कंपाइलर।

1

मैं जॉन लेविन के "Linkers & Loaders" पढ़ने की अत्यधिक अनुशंसा करता हूं। अधिकांश पुस्तक available online here है लेकिन आपको पुस्तक खरीदनी चाहिए और लेखक का समर्थन करना चाहिए। इस पुस्तक ने मुझे वास्तव में द्विआधारी में खोदने के बारे में बहुत कुछ सिखाया।

0

ओडीआर के बारे में आपको एक बिंदु पता होना चाहिए, और विशेष रूप से inline प्रतीकों के लिए इसका क्या अर्थ है।

wikipedia entry एक अच्छी शुरुआत हो सकती है।

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