LD_LIBRARY_PATH कहां है? मैं LD_LIBRARY_PATH env वेरिएबल कैसे सेट करूं?


26

मैं यूनिक्स का उपयोग करके सी ++ प्रोग्राम बनाने की कोशिश कर रहा हूं।

मुझे त्रुटि मिली

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

मैंने सुना है कि मुझे बस अपने LD_LIBRARY_PATH env वेरिएबल में libboost * का स्थान सेट करने की आवश्यकता है और फिर जैसा कि मैंने मूल रूप से किया था, वैसा ही बनाएं

-L /usr/lib64 -l boost_regex-mt

या

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

लेकिन LD_LIBRARY_PATH कहां है? मैं LD_LIBRARY_PATH env वेरिएबल कैसे सेट करूं?


आपने अपना अधिकांश प्रश्न क्यों संपादित किया, जबकि यह आपके मुद्दे को समझने के लिए कुछ उपयोगी संदर्भ प्रदान कर रहा था?
जुलियाग्रे

@ जेलीग्रे I सहमत: मूल प्रश्न द्वारा दिए गए संदर्भ के बिना, शीर्ष-मतदान जवाब का कोई मतलब नहीं है। मैंने उसे वापस घुमाया।
जॉन 1024 21

जवाबों:


25

मैं LD_LIBRARY_PATH env वेरिएबल कैसे सेट करूं?

आपने पहले ही इसे सेट कर दिया था जब आपने ऐसा किया था:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

लेकिन इससे आपकी समस्या हल नहीं होगी। $LD_LIBRARY_PATHनिष्पादन के समय परामर्श दिया जाता है, अतिरिक्त निर्देशिकाओं की एक सूची प्रदान करने के लिए जिसमें गतिशील रूप से लिंक करने योग्य पुस्तकालयों की खोज की जाए। यह लिंक समय पर परामर्श नहीं किया जाता है (निर्मित उपकरणों द्वारा आवश्यक पुस्तकालयों को खोजने के लिए छोड़कर!)।

लिंकर को यह बताने के लिए कि बिल्ड समय पर लाइब्रेरी कहां मिलेगी, आपको -Lलिंकर विकल्प का उपयोग करने की आवश्यकता है । आपने पहले से ही ऐसा किया है:

-L /usr/lib64

यदि आपको अभी भी त्रुटि हो रही है, तो आपको यह सुनिश्चित करने की आवश्यकता है कि पुस्तकालय वास्तव में है। क्या आपके पास कोई फ़ाइल libboost_regex-mt.soया libboost_regex-mt.aउस (या कोई) निर्देशिका में है? ध्यान दें कि इस तरह की एक फ़ाइल libboost_regex-mt.so.othersuffixइस उद्देश्य के लिए गणना नहीं करती है। यदि आपके पास ऐसा नहीं है, तो आपको संभवतः इस लाइब्रेरी के लिए अपने वितरण के विकास पैकेज को स्थापित करने की आवश्यकता है।


लिनक्स के तहत, ld (1) मैन पेज के अनुसार, $LD_LIBRARY_PATHइसके द्वारा भी सलाह दी जाती है ld: «5. एक देशी लिंकर के लिए, पर्यावरण चर" LD_LIBRARY_PATH "की सामग्री खोजें। »
vinc17

@csx - आपका डिस्ट्रो क्या है? Ubuntu, Fedora, CentOS, आदि? यहाँ के लिए उदाहरण के लिए देखें,: stackoverflow.com/questions/15874220/...
SLM

@ vinc17, ldमैनपेज से वह उद्धरण केवल पुनरावर्ती निर्भरता की चिंता करता है: एक पुस्तकालय के आश्रित पुस्तकालयों को जो पहले से ही चयनित होने के लिए चुना गया था। यह निष्पादन योग्य बनाए जाने के लिए पुस्तकालयों को खोजने में चिंता नहीं करता है। वही -Lकरता है।
Celada

@csx मुझे वैज्ञानिक लिनेक्स के बारे में कुछ भी नहीं पता है, लेकिन अगर apt-getआपको कमांड नहीं मिली है तो यह डेबियन नहीं है, इसलिए आपको लापता पैकेज को स्थापित करने के लिए एक और विधि की आवश्यकता है। हालांकि यह निश्चित रूप से आपकी समस्या है।
सेलडा

देर से लेकिन: लिंक चरण को शामिल करने के -Ldir -llibलिए ldया gcc/g++/etcजब तर्कों के रूप में काम करना चाहिए , लेकिन मूल और बहाल क्यू उल्लेख make: एक सामान्य makefile के साथ आप की जरूरत है LDFLAGS="whatever"और एक चतुर makefile के साथ आप ईंटें सहित लगभग कुछ भी जरूरत हो सकती है, चतुर मेकाइल लेखक पर फेंकने के लिए।
dave_thompson_085

11

LD_LIBRARY_PATH में नए पथ को स्थायी रूप से जोड़ने का दूसरा तरीका:

में .confफ़ाइल संपादित करें /etc/ld.so.conf.d/

मैंने कभी एक एप्लिकेशन इंस्टॉल किया है और इसके पुस्तकालयों को किसी अन्य एप्लिकेशन द्वारा मान्यता नहीं दी जा सकती है। फिर मैं फ़ाइल /usr/local/hdf5/libकरने के लिए पथ जोड़ता हूं, अर्थात x86_64-linux-gnu.conf। बस अगली पंक्ति में डाल दिया। बचाना।

तो भागो sudo ldconfig

इसने काम कर दिया।

PS: OS Ubuntu 14.04


4

आप इसे अपने ~/.profileऔर / या अपने शेल के विशिष्ट इनिट फ़ाइल में सेट कर सकते हैं (जैसे ~/.bashrcbash के लिए, ~/.zshenvzsh के लिए)। फिर आपको अपने शेल को पुनरारंभ करने की आवश्यकता है (और संभवतः अपनी पसंद के आधार पर लॉग आउट करें और फिर से लॉग इन करें)।

आप अपनी सेटिंग्स की जाँच कर सकते हैं:

env | grep '^LD_LIBRARY_PATH'

संपादित करें: LD_LIBRARY_PATHसाझा पुस्तकालयों के लिए है जिसमें मशीन कोड होता है, जिनके फ़ाइलनाम में आमतौर पर .soउनका नाम होता है, संभवत: विभिन्न संस्करणों को अलग करने के लिए समय-समय पर अलग-अलग संख्याओं के बाद। यह संभव है कि बावजूद LD_LIBRARY_PATH, एबीआई बेमेल के कारण एक पुस्तकालय नहीं मिला है। यह भी ध्यान दें कि भाषाओं (जैसे पर्ल और पायथन) और पैकेजों में पुस्तकालयों की अपनी प्रणाली हो सकती है (संभवतः .soफाइलों के साथ भी ), असंबंधित LD_LIBRARY_PATH


मेरा संकलित कार्यक्रम अभी भी एक अजगर पुस्तकालय नहीं मिलने के बारे में शिकायत करता है, हालांकि मैं एनवी का उपयोग करके सही मार्ग देखता हूं grep '^ LD_LIBRARY_PATH'। मामला क्या हो सकता है?
हरमन टूथ्रोट

@HermanToothrot मैंने अपना उत्तर अपडेट कर दिया है। ध्यान दें कि अजगर के पास पुस्तकालयों की अपनी प्रणाली है। मुझे संदेह है कि इसका उपयोग नहीं है LD_LIBRARY_PATH(सामान्य पुस्तकालयों के साथ टकराव से बचने के लिए)। आपको इसके लिए एक विशिष्ट प्रश्न पूछने की आवश्यकता है, जिसमें आपको त्रुटि संदेश मिलता है।
vinc17 8

3

यदि संकलक के दौरान आपकी लाइब्रेरी पथ त्रुटि है, तो आपको लायब्रेरी के लिए पथ को चर $ LD_LIBRARY_PATH में जोड़ना होगा। यदि लाइब्रेरी त्रुटि तब है जब आप वास्तव में संकलित प्रोग्राम चलाते हैं, तो आपको लाइब्रेरी खोज पथ कैश के पुनर्निर्माण के लिए लाइब्रेरी पथ को /etc/ld.so.conf में जोड़ना होगा और ldconfig चलाना होगा।


यह बहुत अच्छा काम किया! मेरी conf फ़ाइल इस निर्देशिका /etc/ld.so.conf.d को इंगित करती है, इसलिए बस उस फ़ोल्डर में अपने काम के पथ के साथ एक फ़ाइल जोड़ें। यह भी सुनिश्चित करें कि ldconfig को रूट के रूप में चलाएं (या इसे sudo)
RLaaa

0

इसके साथ हल:

में जोड़ें /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.