2010-02-09 10 views
7

मैं कक्षा के लिए सी और सी ++ फ़ाइलों को ग्रेडिंग कर रहा हूं, और यह असाइनमेंट जीएसएल लाइब्रेरी का उपयोग करता है। चूंकि मेरे पास मेरे कंप्यूटर पर रूट अनुमति नहीं है, इसलिए मेरी जीएसएल लाइब्रेरी मेरी होम निर्देशिका में स्थापित है, और इस प्रकार मुझे कंपाइलर्स और लिंकर्स को यह कहने की ज़रूरत है कि इसे कहां मिलना है।एलडी को बताएं कि पर्यावरण चर के माध्यम से निर्देशिकाओं को देखने के लिए

यह एक समस्या है जब मैं एक कार्यक्रम अपने आप लिखते हैं, क्योंकि मैं सिर्फ जीसीसी के लिए उपयुक्त एल और मैं झंडे जोड़ नहीं है।

लेकिन जब मैं छात्र की फ़ाइलें संकलन कर रहा हूँ, मैं उनकी makefiles में से हर एक को संपादित नहीं करना चाहती। इसके बजाय, मैं उपयुक्त निर्देशिका को पर्यावरण चर में रखना चाहता हूं, ताकि यह निर्बाध रूप से हो।

इस उद्देश्य से, मैं पुस्तकालय के साथ निम्न चर निर्यात या स्थानों को शामिल किया है: C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, LIBRARY_PATH और LD_LIBRARY_PATH

लेकिन जब मैं एक छात्र की परियोजना, संकलन के साथ

gcc -Wall -o MC_thread MC_thread.c -lgsl -lgslcblas -lpthread -lm 

मुझे निम्न त्रुटि मिलती है:

/usr/bin/ld: cannot find -lgsl 
collect2: ld returned 1 exit status 
make: *** [all] Error 1 

मैं जीसीसी बनाम 4.1.2 का उपयोग कर रहा हूं। अगर मैं जीसीसी वी 4.4 का उपयोग करता हूं तो मुझे वास्तव में त्रुटि नहीं मिलती है, लेकिन मुझे कोई संकेत नहीं है। (कम से कम 4.4 संस्करण)

 
     LIBRARY_PATH 
      The value of LIBRARY_PATH is a colon-separated list of directories, 
      much like PATH. When configured as a native compiler, GCC tries 
      the directories thus specified when searching for special linker 
      files, if it can't find them using GCC_EXEC_PREFIX. Linking using 
      GCC also uses these directories when searching for ordinary 
      libraries for the -l option (but directories specified with -L come 
      first). 

और फिर उसके बाद LD_LIBRARY_PATH का उपयोग जब आप उनके कार्यक्रमों के लिए करने के लिए चलाए

ld -V 
GNU ld version 2.17.50.0.6-12.el5 20061020. 
+1

मानव वार्ड और मैन ld.so को पर्यावरण के वर्रों के लिए उपयोग करने का प्रयास करें। एलडी_LIBRARY_PATH काम कर सकता है। – Eugene

+2

मुझे लगता है कि एलडी_LIBRARY_PATH का उपयोग केवल ld.so द्वारा किया जाता है, एलडी द्वारा नहीं। चूंकि यह एक संकलित-समय त्रुटि है, रन-टाइम त्रुटि नहीं, मैं पर ध्यान केंद्रित करता हूं कि क्यों LIBRARY_PATH काम नहीं करता है। दो चीजें जिन्हें मैं सत्यापित करूंगा, क्या लाइब्रेरी फ़ाइल का सही नाम है और वास्तव में जीबीसी निष्पादन वातावरण में परिभाषित LIBRARY_PATH वास्तव में है? –

+0

'-v' विकल्प के साथ gcc चलाने का प्रयास करें और आउटपुट से पूर्ण ld आमंत्रण पोस्ट करें। –

उत्तर

11

आप वातावरण चर LIBRARY_PATH

का उपयोग कर man gcc से कोशिश कर सकते: मेरी लिंकर है रन-टाइम लिंकर को पुस्तकालयों को ढूंढने दें।

+0

ओपी ने कहा कि वह LIBRARY_PATH का उपयोग कर रहा था (और यह आपकी पोस्ट के बाद से एक संपादन की तरह दिखता नहीं है।) – jtniehof

0

मेरी सलाह उनके makefiles में एक CFLAGS वातावरण चर का समर्थन करने के लिए छात्रों की आवश्यकता होती है, वरना वे असफल हो। :) फिर आप CFLAGS = "- Lwhatever" निर्यात कर सकते हैं।

या आप एलडी_LIBRARY_PATH का उपयोग कर सकते हैं।

+0

आप शायद एलडीएफएलजीएस का मतलब है, क्योंकि -एल और -एल लिंकर पैरामीटर हैं, संकलक-चरण पैरामीटर नहीं। लेकिन हाँ, मैं सहमत हूं। इन चर के बिना मेकफ़ाइल बेकार हैं। –

2

जवाब का एक बहुत ऊपर LD_LIBRARY_PATH के उपयोग का सुझाव देते हैं। लेकिन यह गलत है क्योंकि यह गतिशील (रनटाइम) लिंकर के लिए एक पर्यावरणीय चर है, संकलन समय लिंकर एलडी नहीं। बिंदु है जिस पर वे का निर्माण नियम निर्धारित में अपने Makefile में

-L$(EXTRA_LINK_DIRECTORY) 

:

यह करने के लिए सही तरीका की तरह कुछ संलग्न करने के लिए छात्रों की आवश्यकता है। तब, जब आप संकलन, की तरह कुछ कार्य करें:

निर्यात EXTRA_LINK_DIRECORY =/घर/...

1

आप एक 64-बिट मशीन पर हैं, तो यह है कि शायद समस्या है। ओएमएम, जीसीसी 4.1 LIBRARY_PATH में निर्दिष्ट पथों की खोज नहीं करता है, बल्कि पथ /../ lib64। आपको सीधे -L निर्दिष्ट करने की आवश्यकता होगी, या निर्देशिका को lib64 पर उसी स्तर पर symlink, या gcc चश्मे के साथ गड़बड़ करना होगा।

http://gcc.gnu.org/ml/gcc-help/2010-11/msg00360.html और Why does g++ look in LIBRARY_PATH/../lib64 and where is this documented?

(OMM, इस जीसीसी 4 के साथ काम करता देखें।5 बिना किसी गड़बड़ी के, तो मुझे लगता है कि उन्होंने इसे बाद में तय किया है।)

+0

spec फ़ाइल के साथ बजाना बहुत मदद नहीं करता है, या तो, इसे केवल lib का उपयोग करने के बाद से इसका मतलब है कि जीसीसी को अपनी आंतरिक बिट्स नहीं मिलती हैं, और इसे lib और lib64 दोनों की खोज करने का अर्थ है जीसीसी असंगत 32- बिट संस्करण यह पाता है। – jtniehof

+0

शायद यह था! चूंकि मैंने स्वयं जीएसएल स्थापित किया है, इसलिए मेरे पास lib/और lib64/निर्देशिका दोनों नहीं हैं, बल्कि (64-बिट) पुस्तकालयों के साथ केवल एक स्थान है लेकिन अपेक्षित lib64/name के बिना। यह काफी परेशान विशेषता है। मुझे लगता है कि जीसीसी 4.4 और 4.5 में बेहतर व्यवहार है – Stephen

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