2012-11-10 23 views
8

में गणित लाइब्रेरी को लिंक नहीं करना मुझे पता है कि यह त्रुटि मौत के लिए पीटा गया है, लेकिन मुझे इसे काम करने के लिए प्रतीत नहीं होता है। मैं नीचे मेरी makefile लिंक किया है: इस तरह के रूप-lm मेकफ़ाइल

all: gensine info cs229towav 

encode.o: encode.h encode.c 
    gcc -c encode.c 

write.o: write.c write.h 
    gcc -c write.c 

gensine.o: encode.c gensine.h gensine.c helper.c write.c 
    gcc -c gensine.c -lm 

helper.o: helper.c helper.h 
    gcc -c helper.c 

read.o: read.h read.c 
    gcc -c read.c 

info.o:read.c info.h info.c decode.c 
    gcc -c info.c 

decode.o: decode.c decode.h helper.c 
    gcc -c decode.c 

cs229towav.o: write.c read.c cs229towav.c cs229towav.h helper.c decode.c encode.c 
    gcc -c cs229towav.c -lm 

gensine: encode.o gensine.o write.o helper.o 
    gcc -o gensine encode.o gensine.o write.o helper.o -lm 

info: read.o info.o decode.o helper.o 
    gcc read.o info.o decode.o helper.o 

cs229towav: write.o read.o cs229towav.o decode.o encode.o helper.o 
    gcc -o write.o read.o cs229towav.o decode.o encode.o helper.o -lm 

Clean: 
    rm -rf *o gensine info cs229towav 

जब मैं एक आदेश चला मैं निम्नलिखित परिणाम के साथ वापस आ रहा हूँ "gensine बनाने":

>cc gensine.c -o gensine 
/tmp/ccojm09X.o: In function `encodeCsFormat': 
gensine.c:(.text+0x4b1): undefined reference to `sin' 
/tmp/ccojm09X.o: In function `encodeWavFormat': 
gensine.c:(.text+0xa39): undefined reference to `sin' 
collect2: error: ld returned 1 exit status 

इस पढ़ने के बाद है पाप को अपरिभाषित संदर्भ में कहते हैं, जो गणित पुस्तकालय के साथ है। सूचीबद्ध उन फ़ंक्शंस "encode.c" फ़ाइल में हैं जो "gensine.c" फ़ाइल में शामिल हैं।

+3

वह आउटपुट खंड उपरोक्त मेकफ़ाइल के अनुरूप प्रतीत नहीं होता है, क्या आप निश्चित रूप से सही मेकफ़ाइल चुन रहे हैं? – fvu

उत्तर

11

makefile में आदेश:

gcc -o gensine encode.o gensine.o write.o helper.o -lm 

आदेश आप अंत में मुद्रित से मेल नहीं खाता:

cc gensine.c -o gensine 

भी सूचना है कि वहाँ कोई -lm

ध्यान दें कि make जानता है ऑब्जेक्ट फ़ाइलों को कैसे बनाएं ताकि आपको अधिकांश मेकफ़ाइल की आवश्यकता न हो। इस (टैब के साथ इंडेंट करने के लिए याद) का प्रयास करें:

.PHONY : all clean 
all = gensine info 
CFLAGS =-Wall 
LIBS = -lm 

gensine: encode.o gensine.o write.o helper.o 
     gcc -o [email protected] $^ $(LIBS) 

info: read.o info.o decode.o helper.o 
     gcc -o [email protected] $^ $(LIBS) 

cs229towav: write.o read.o cs229towav.o decode.o encode.o helper.o 
     gcc -o [email protected] $^ $(LIBS) 

clean: 
     rm -rf *.o gensine info cs229towav 

संपादित करें:

Boddie, ध्यान दें कि आपके भ्रम पैदा हुई है क्योंकि आप सोचा makefile एक स्क्रिप्ट था - अर्थात्। जब आप make gensine टाइप करते हैं तो आप make नामक अपनी स्क्रिप्ट चला रहे थे। वास्तव में make फाइल सिस्टम में कहीं और gcc जैसे कमांड है (लिनक्स आदि पर, यह देखने के लिए which make टाइप करें)। make कमांड को मौजूदा निर्देशिका में makefile या Makefile नामक निर्माण नियम वाली इनपुट फ़ाइल ढूंढने की अपेक्षा की जाती है। अगर यह फ़ाइल नहीं मिलती है तो यह इसके बजाय कुछ अंतर्निहित नियमों का उपयोग करती है - इसलिए cc gensine.c -o gensine जो आपके मेकफ़ाइल में कहीं भी नहीं है। यदि आप चाहते हैं, तो make मेकफ़ाइल का नाम बताएं (ताकि यह डिफ़ॉल्ट नामों का उपयोग न करे) -f स्विच के साथ, @DanielFischer टिप्पणियों में वर्णित है।

+0

मैं फ़ाइल का उपयोग करता हूं, और मुझे पहले की तरह ही त्रुटि मिलती है। यह कंपाइलर – boddie

+0

से भी वही आउटपुट है जिसे आपने मेकफ़ाइल कहा था? क्या आपके पास निर्देशिका में एक से अधिक मेकफ़ाइल है? –

+0

मैंने इसे "मेक" नामित नहीं किया है, और फिर मैंने "मेन्स जेन्सिन" कहा है – boddie