command line - कोड:: ब्लॉक जीसीसी पर काम करने के लिए $ ORIGIN के साथ RPATH कैसे प्राप्त करें?




command-line gcc (2)

मैं RPATH को लिंक करने का प्रयास कर रहा हूं जिसमें कोड = ब्लॉक आईडीई के साथ जीसीसी का उपयोग कर निर्मित निष्पादन योग्य में विशेष स्ट्रिंग $ ORIGIN शामिल है I मैंने निर्दिष्ट किया है

-Wl,-R$ORIGIN

परियोजना के लिए लिंकर विकल्प में, लेकिन जीसीसी को कमांड लाइन आउटपुट गलत है (स्पष्टता के लिए छीन लिया गया है):

g++ -Wl,-R

कोड :: ब्लॉकों के लिए यह तर्क निर्दिष्ट करने का सही तरीका क्या है?


जो भी टोकन $ ORIGIN बनाने का निर्णय लिया है वह एक बुराई आबादी है जो प्रोग्रामर नरक में एक विशेष स्थान का हकदार है। चूंकि '$' बाश और अन्य स्क्रिप्टिंग भाषाओं के लिए एक विशेष चरित्र है, जैसे कि इसे सावधानी से बचने तक सबकुछ ठीक हो जाए इससे भी बदतर, आप जिस वातावरण का उपयोग कर रहे हैं, उसके आधार पर, ठीक से भागने की विशेषताओं की संभावना बदल जाएगी

बैश में, आपको $ के सामने एक बैकस्लैश छड़ी करने की आवश्यकता है:

-Wl,-R\$ORIGIN

कोड :: ब्लॉक जाहिरा तौर पर भी विशेष रूप से डॉलर का व्यवहार करता है। फिर, जो भी सबप्रोसेसर नियंत्रक कोड :: ब्लॉकों बैकस्लैश को विशेष रूप से व्यवहार करने का आदेश भेजता है। इसलिए, बैकस्लाश और $ को दोगुना होने की जरूरत है ताकि वह ठीक से भाग जाए। इसलिए, कोड :: ब्लॉक लिंकर सेटिंग में, आपको निर्दिष्ट करना होगा:

-Wl,-R\\$$ORIGIN

... जो उत्पादन करता है:

-Wl,-R\\$ORIGIN

... बनाने के लॉग में, लेकिन वास्तव में शेल भेजा जाता है:

-Wl,-R\$ORIGIN

... जो ऊपर उल्लेख किया गया है वांछित परिणाम उत्पन्न करता है

क्या मुसीबत है।


यदि आपके निष्पादन योग्य एक विशाल जटिल स्क्रिप्ट पर्यावरण द्वारा निर्मित नहीं किया जा रहा है, जो आपके द्वारा नहीं बनाया गया है, और आप उस के साथ setenv LD_RUN_PATH='$ORIGIN/../lib' करना नहीं चाहते हैं, setenv LD_RUN_PATH='$ORIGIN/../lib' साथ चलने की कोशिश कर रहे हैं; अगर वह काम नहीं करता है, तो एक व्यावहारिक दृष्टिकोण एलडी के लिए एक आवरण बनाना है:

#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "[email protected]"

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

(यहाँ "/ usr / bin / ld" एलडी है जो आमतौर पर चलाया जाता था, जो कहीं और हो सकता है। जीसीसी रास्ते से एलडी नहीं उठा सकता है, इसे ओवरराइड करने के लिए जीसीसी पर्यावरण चर देखें। माइलेज अलग-अलग हो सकता है। सिंगल उपयोग केवल किसी भी अन्य दृष्टिकोण से कम भयानक नहीं होना चाहिए)।





rpath