2011-05-05 15 views
15

2 फ़ाइलें: a.c और b.cसी में "varName के अपरिभाषित संदर्भ" का अर्थ क्या है?

a.c में मैं b.c

signal(SIGUSR1,doSomething); 

एसी फ़ाइल के शीर्ष पर में स्थित एक समारोह के लिए एक संकेत भेज रहा हूँ, मेरे पास है:

extern void doSomething (int sig); 

/tmp/ccCw9Yun.o: In function main':
a.c:(.text+0xba): undefined reference to
doSomething'
collect2: ld returned 1 exit status

:

जब मैं संकलन, तथापि, मैं कोई त्रुटि मिलती है

निम्न हेडर शामिल किए गए हैं:

#include <stdlib.h> 
#include <stdio.h> 
#include <signal.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

मैं इसे कैसे ठीक कर सकता हूँ?

+0

कृपया अपना हेडर ('.h') फ़ाइलें दिखाएं। –

+3

यह एक लिंकर त्रुटि है –

+0

क्या 'doSomething' वास्तव में 'b.c' में परिभाषित किया गया है? – Borealid

उत्तर

17

आप की जरूरत है शामिल करने के लिए याद किया लिंक a.o और b.o दोनों:

gcc -o program a.c b.c 

आप प्रत्येक फ़ाइल में एक main() है, तो आप उन्हें एक साथ लिंक नहीं कर सकते।

हालांकि, अपने a.c फ़ाइल doSomething() का संदर्भ होता है और एक स्रोत फ़ाइल है कि doSomething() को परिभाषित करता है और किसी भी समारोह है कि a.c (जैसे main()) में परिभाषित किया गया है परिभाषित नहीं करता है के साथ जुड़े होने की उम्मीद है।

आप प्रक्रिया बी में एक समारोह प्रक्रिया ए से आप एक समारोह के लिए एक संकेत नहीं भेज सकते हैं फोन नहीं कर सकते हैं; आप kill() सिस्टम कॉल का उपयोग करके प्रक्रियाओं के संकेत भेजते हैं।

signal() समारोह को निर्दिष्ट करता है अपने वर्तमान प्रक्रिया में जो समारोह (प्रोग्राम) संकेत को संभालने के लिए जब अपने प्रक्रिया संकेत प्राप्त हो रहा है। कैसे Programa पता करने के लिए जो प्रक्रिया ID को संकेत भेजने के लिए जा रहा है -

आप समझ है कि यह कैसे काम करने के लिए जा रहा है क्या करने के लिए कुछ गंभीर काम है। b.c में कोड dosomething संकेत हैंडलर के रूप में साथ signal() कॉल करने की आवश्यकता जा रहा है। a.c में कोड बस अन्य प्रक्रिया को संकेत भेजने जा रहा है।

gcc -c a.c 
gcc -c b.c 
gcc a.o b.o -o prog 
+0

बात यह है .. a.c और b.c प्रत्येक प्रत्येक मुख्य कार्य को परिभाषित करता है। कंपाइलिंग .o फाइलों के परिणामस्वरूप 'मुख्य' – JAM

+0

@mac अच्छी तरह से कई परिभाषाओं में त्रुटि होती है, यदि आप किसी दूसरे के कार्यों पर निर्भर होने जा रहे हैं तो आपको उन्हें एक साथ जोड़ना होगा; अगर उनके पास डुप्लिकेट फ़ंक्शंस हैं तो आपको इसे किसी भी तरह हल करने की आवश्यकता है (हो सकता है कि 'doSomething' को किसी तीसरे फ़ाइल में खींचें जो 'a.c' और' b.c' दोनों पर निर्भर करता है) –

+0

मुझे मिल गया। सिग्नल() का उपयोग करने के बजाय ... मैंने मार डाला (pid_to_send_signal_to, हैंडलर); – JAM

3

आप एक लिंकर त्रुटि आ रही है, तो अपने निर्वासन (संकलक एक समस्या के बिना संकलित a.c) काम कर रहा है, लेकिन यह अपने निर्वासन हल नहीं कर सका जब यह लिंक करने के लिए अंत में वस्तु एक साथ फ़ाइलें चला गया - void doSomething(int); वास्तव में कहीं भी नहीं मिला था। क्या आप बाहरी गड़बड़ कर चुके थे? यकीन है कि वहाँ वास्तव में एक doSomethingb.c में परिभाषित किया गया है कि एक int लेता है और void देता है, और बनाने सुनिश्चित करें कि आपके फ़ाइल सूची में b.c (यानी आप gcc a.c b.c की तरह कुछ कर रहे हैं, न कि केवल gcc a.c)

3

आप इस तरह वस्तु फ़ाइलों लिंक संकलन करने की जरूरत है और फिर।

gcc -o programName a.c b.c 

या यदि आप अलग से संकलित करने के लिए चाहते हैं, तो यह होगा:: यह एक ही समय में दोनों फ़ाइलों संकलन के द्वारा संकलन स्तर पर किया जाता है

gcc -c a.c 
gcc -c b.c 
gcc -o programName a.o b.o 
4

यह करने के लिए एक प्रारंभिक प्रतिक्रिया पूछने के लिए और यह सुनिश्चित करें कि दो वस्तु फ़ाइलों को एक साथ जोड़ा जा रहा है करने के लिए होगा:

10

यह बहुत बुरा शैली बाहरी परिभाषित करने के लिए है .c फाइलों में इंटरफेस। ।

आप इस

a.h

extern void doSomething (int sig); 

a.c

void doSomething (int sig) 
    { 
     ... do stuff 
    } 

ई.पू.

#include "a.h" 
..... 
signal(SIGNAL, doSomething); 

करना चाहिए।

1

सुनिश्चित करें कि आपका काम कुछ काम स्थिर नहीं है।

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