2011-01-09 5 views
5

मैं डेल्फी के लिए नया हूं। मैं अपने डेल्फी प्रोजेक्ट में सी ऑब्जेक्ट फाइलों को जोड़ने की कोशिश कर रहा था और डेल्फी सी ऑब्जेक्ट लिंकिंग का समर्थन करता था क्योंकि उन्हें सीधे लिंक करता था। जब मैं एक ऑब्जेक्ट फ़ाइल को लिंक करता हूं तो मुझे यह काम मिल गया। लेकिन जब मैं एकाधिक ऑब्जेक्ट फ़ाइलों को लिंक करने का प्रयास करता हूं, तो मुझे त्रुटि 'असंतुष्ट आगे या बाहरी घोषणा' मिल रही है। मैंने डेल्फी 2007 के साथ-साथ XE में भी कोशिश की है। तो मैं यहाँ क्या गलत कर रहा हूं?डेल्फी 2007 में एकाधिक सी ऑब्जेक्ट फ़ाइलों को जोड़ने के दौरान त्रुटि

कार्य कोड:

function a_function():Integer;cdecl; 

implementation 

{$Link 'a.obj'} 

function a_function():Integer;cdecl;external; 

end. 

त्रुटि कोड:

function a_function():Integer;cdecl; 
function b_function();Integer;cdecl; 
function c_function();Integer;cdecl; 

implementation 

{$LINK 'a.obj'} 
{$LINK 'b.obj'} 
{$LINK 'c.obj'} 

function a_function():Integer;cdecl;external; 
function b_function();Integer;cdecl;external; 
function c_function();Integer;cdecl;external; 
end. 
+0

मेरा अनुमान है: "b_function()" या "c_function()" तीन ऑब्जेक्ट फ़ाइलों में से किसी एक में नहीं मिला है। आप समस्या को कई ऑब्जेक्ट फ़ाइलों को जोड़ने से संबंधित मानते हैं और आपने साबित किया है कि आप एक फ़ाइल को लिंक कर सकते हैं। क्या आपने लिंक करने का प्रयास किया, उदाहरण के लिए, केवल "बी.ओबीजे" और केवल "b_function()" आयात किया? –

+0

शायद रूडी वेल्थुइस द्वारा यह आलेख मदद कर सकता है: http://rvelthuis.de/articles/articles-cobjs.html – vcldeveloper

उत्तर

7

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

हालांकि, मुझे संदेह है कि मुझे पता है कि यहां क्या हो रहा है। मैं इस दृष्टिकोण का उपयोग करता हूं लेकिन वास्तव में इकाई में 100 से अधिक .obj फ़ाइलें हैं। मुझे लगता है कि जब मैं नए जोड़ता हूं, तो मुझे वही लिंकर त्रुटि मिलती है जैसा आप करते हैं। जिस तरह से मैं इसके आसपास काम करता हूं वह है कि मैं अपने $ LINK निर्देशों को फिर से ऑर्डर करने का प्रयास करूं। मैं नई ओबीजे फाइलों को एक-एक करके जोड़ने की कोशिश करता हूं और अंत में, मैं इस समस्या को हल करने में हमेशा सक्षम हूं।

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

लिंकर में यह विषमता डेल्फी 6 में मौजूद था और डेल्फी में मौजूद है 2010.

संपादित करें 1: अहसास अब मुझ पर लगा दिया है कि इस मुद्दे की वजह से डेल्फी एक भी पास संकलक का उपयोग करने के शायद है । मुझे संदेह है कि "गायब बाहरी संदर्भ" त्रुटि यह है क्योंकि संकलक .obj फ़ाइलों को उस क्रम में संसाधित करता है जिसमें वे इकाई में दिखाई देते हैं।

मान लीजिए कि a.obj b.obj से पहले प्रकट होता है और फिर भी a.obj b() b.obj में एक फ़ंक्शन कॉल करता है। कंपाइलर नहीं जानता कि बी() उस बिंदु पर रहता है जहां इसे फ़ंक्शन कॉल को ठीक करने की आवश्यकता होती है। जब मुझे समय लगता है, तो मैं कोशिश करता हूं और परीक्षण करता हूं कि क्या यह परिकल्पना कम से कम व्यावहारिक है!

अंत में, समस्या से बाहर एक और आसान तरीका ए सी, बी सी और सीटी को एक सी फाइल में जोड़ना होगा जो मुझे लगता है कि ओपी के लिए इस मुद्दे को बाईपास करना है।

संपादित 2: stackoverflow.com/questions/3228127/why-does-the-order-of-linked-object-file-with-l-directive-matter

संपादित 3:: मैं एक और स्टैक ओवरफ़्लो सवाल है कि इस जमीन को शामिल किया गया पाया मैं इस समस्या को हल करने के लिए एक और सही मायने में बढ़िया तरीका मिल गया है।हर बार जब संकलक शिकायत

[DCC Error] Unit1.pas(1): E2065 Unsatisfied forward or external declaration: '_a' 

आप बस, इकाई के कार्यान्वयन अनुभाग में, एक घोषणा तो की तरह जोड़ें:

procedure _a; external; 

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

मेरे ज्ञान के सर्वोत्तम में यह एकमात्र तरीका है जो दो वस्तुओं को आयात करने का एकमात्र तरीका है जो एक-दूसरे को संदर्भित करते हैं एक गोलाकार तरीका। मेरा मानना ​​है कि इस तरह से बाहरी प्रक्रिया की घोषणा एक आगे की घोषणा करने के समान है। अंतर यह है कि कार्यान्वयन पास्कल कोड की बजाय किसी ऑब्जेक्ट द्वारा प्रदान किया जाता है।

अब मैं अपनी शस्त्रागार में कुछ और टूल्स जोड़ने में सक्षम हूं - प्रश्न पूछने के लिए धन्यवाद!

+0

आपको बहुत बहुत धन्यवाद। मुझे लगता है कि एकल पास लिंकर समस्या है। मैं 30 से अधिक ऑब्जेक्ट्स को जोड़ रहा हूं जो अकेले नहीं हैं। तो मुझे अपनी ऑब्जेक्ट फाइलों को फिर से व्यवस्थित करना होगा या फिर एक फ़ाइल में रखना होगा। – Ramnish

+0

@Ramnish मुझे यह जानने में दिलचस्पी होगी कि आप कैसे चलते हैं। पेडेंटिक रूप से, मुझे लगता है कि यह संकलक है जो लिंकर की बजाय एकल पास है और मेरी सहजताएं मुझे बताती हैं कि यह एक लिंकर मुद्दे की बजाय एक कंपाइलर मुद्दा है, लेकिन मैं केवल इस पर अनुमान लगा रहा हूं! –

+0

@ रमनीश मुझे एक और स्टैक ओवरफ़्लो प्रश्न मिला जो इस ग्राउंड को कवर करता है: http://stackoverflow.com/questions/3228127/why-does-the-order-of-linked-object-file-with-l-directive-matter –

0

आपका वाक्य रचना ठीक है, लेकिन जैसे कॉस्मिन ने कहा कि यह है कि कुछ के साथ b.obj, c.obj या b_function और c_function गलत है की संभावना है।

यदि संभव हो तो वास्तविक कोड और लिंकर आउटपुट संदेशों को दिखाने के लिए उन्हें व्यक्तिगत रूप से पहले जोड़ने या अपनी पोस्ट को संपादित करने का प्रयास करें।

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