2012-11-06 18 views
49

में एलडीएफएलजीएस का उपयोग कैसे करें मैं लिनक्स ओएस में नया हूं। मैं मेकफ़ाइल का उपयोग कर .c फ़ाइल को संकलित करने का प्रयास कर रहा हूं। गणित पुस्तकालय को जोड़ा जाना है। मेरे makefile इस तरह दिखता है:मेकफ़ाइल

"undefined reference to rint" 

तो यह गणित पुस्तकालय लिंक करने में सक्षम नहीं है:

CC=gcc 
CFLAGS=-Wall -lm 

all:client 

.PHONY: clean 
clean: 
    rm *~ *.o client 

जब मैं make चलाने के लिए, मैं निम्नलिखित त्रुटि मिलती है।

लेकिन जब मैं स्पष्ट रूप से

gcc client.c -lm -o client 

इसे सफलतापूर्वक संकलित का उपयोग कर संकलित करें।

तो मुझे अपनी मेकफ़ाइल कैसे बदलनी चाहिए ताकि यह काम करे। मैंने पहले ही LDFLAGS=-lm जोड़ने का प्रयास किया है। लेकिन मुझे एक ही त्रुटि मिलती है।

मैं भी जोड़ना चाहिए कि जब मैं make चलाने के लिए, यह

gcc -Wall -lm client.c -o client 

(सूचना है कि जब मैं अंत में स्पष्ट रूप से gcc चलाने -lm के साथ, यह काम करता है) करने के लिए फैलता है।

उत्तर

52

आपका लिंकर (LD) स्पष्ट रूप से जिस क्रम में बनाने पसंद नहीं करता जीसीसी तर्क की व्यवस्था है ताकि आप अपने Makefile थोड़ा बदलना होगा: लाइन ग्राहक को परिभाषित करते

CC=gcc 
CFLAGS=-Wall 
LDFLAGS=-lm 

OBJECTS=client.o 

client: $(OBJECTS) 
    $(CC) $(CFLAGS) $(OBJECTS) -o client $(LDFLAGS) 

all:client 

.PHONY: clean 
clean: 
    rm -f *~ *.o client 

लक्ष्य आवश्यकतानुसार $ (एलडीएफएलजीएस) के आदेश को बदलता है।

+40

LDLIBS पुस्तकालयों के लिए है के साथ करने के लिए कुछ मिल गया है, LDFLAGS झंडे/खोज पथ (एल) – falstaff

+3

[आप स्पष्ट रूप से परिभाषित करने के लिए की जरूरत नहीं है के लिए इस्तेमाल किया जाना चाहिए 'सीसी'।] (Http://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html) – 0xcaff

+3

मैंने यह भी सोचा कि -एलएम एलडीएफएलजीएस में होना चाहिए लेकिन जैसा कि यह निकला है (देखें लैनदिर का जवाब और https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html), यह बजाय LOADLIBES में होना चाहिए, और फिर सब कुछ (यानी बॉक्स से बाहर काम करता है स्पष्ट नियमों को परिभाषित करने के बिना) ! –

41

अधिक जटिल निर्माण परिदृश्यों में, संकलन और असेंबली पहले (घटकों को ऑब्जेक्ट करने के लिए आउटपुट) के साथ संकलन को तोड़ना आम है, और ऑब्जेक्ट फ़ाइलों को अंतिम निष्पादन योग्य या लाइब्रेरी में जोड़ना - यह पुन: संकलित करने से रोकता है सभी ऑब्जेक्ट फ़ाइलें जब उनकी स्रोत फ़ाइलें परिवर्तित नहीं होती हैं। यही कारण है कि लिंकिंग ध्वज -lm सहित काम नहीं कर रहा है जब आप इसे CFLAGS (CFLAGS संकलन चरण में उपयोग करते हैं) में डालते हैं।

पुस्तकालयों जोड़ा जा करने के लिए सम्मेलन उन्हें या तो LOADLIBES या LDLIBS में रखने के लिए है (जीएनयू कर दोनों शामिल हैं, लेकिन आपका माइलेज भिन्न हो सकते हैं):

LDLIBS=-lm 

यह आपको अंतर्निहित का उपयोग जारी रखने के लिए अनुमति चाहिए अपने स्वयं के लिंकिंग नियम लिखने के बजाय नियमों में। अन्य बनाता है, अंतर्निहित नियमों को आउटपुट करने के लिए ध्वज होना चाहिए (जीएनयू बनाने के लिए, यह -p है)। मेकअप के अपने संस्करण को जोड़ने के लिए निर्मित एक नियम नहीं है, तो (या अगर यह -l निर्देशों के लिए एक प्लेसहोल्डर नहीं है), तो आप लिखने के लिए की आवश्यकता होगी अपनी खुद की:

client.o: client.c 
    $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o [email protected] $< 

client: client.o 
    $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 
1

के आदेश की तरह लगता है लिंकिंग झंडे जीसीसी के पुराने संस्करणों में कोई मुद्दा नहीं था। जैसे gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16) इनपुटफाइल से पहले लिंकर विकल्प से खुश Centos-6.7 के साथ आता है; लेकिन उबंटू 16.04 gcc (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413 के साथ जीसीसी की अनुमति नहीं है।

इसकी नहीं अकेले जीसीसी संस्करण, मैं distros