2012-09-13 12 views
9

मेरे पास एक निष्पादन योग्य है जो कई रूप से लोड करता है। इसलिए पुस्तकालय, उनमें से सभी मेरे द्वारा निर्मित किए गए हैं। तैनाती, या कम से कम परीक्षण/डिबगिंग के लिए, मैं उन सब को एक ही निर्देशिका में करना चाहते हैं:लिनक्स आरपीएथ में निष्पादन योग्य स्थान को एन्कोड कैसे करें?

my_executable 
libmylib1.so 
libmylib2.so 

परोक्ष पुस्तकालयों लोड करने के लिए निष्पादन योग्य पाने के लिए, मैं एक rpath निर्धारित करना चाहते हैं (DT_RUNPATH) निष्पादन योग्य निर्देशिका के लिए। ओएस एक्स के साथ, मैं तो जैसे ऐसा करने चाहते हैं:

clang -dynamiclib -o libmylib1.dylib -install_name @rpath/libmylib1.dylib src1.c src2.c  
clang -dynamiclib -o libmylib2.dylib -install_name @rpath/libmylib2.dylib src3.c src4.c 
clang -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath,@loader_path/. main.c 

सूचना @loader_path/. कि लिनक्स के साथ ओएस एक्स में निष्पादन के rpath रूपों, निकटतम मैं यह करने के लिए आ सकते हैं

gcc -dynamiclib -o libmylib1.so src1.c src2.c  
gcc -dynamiclib -o libmylib2.so src3.c src4.c 
gcc -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath=. main.c 

यहां समस्या यह है कि लिनक्स पर आरपीएथ वर्तमान कार्यशील निर्देशिका का पालन करता है, निष्पादन योग्य निर्देशिका नहीं। लिनक्स पर एक ही चीज़ को पूरा करने का कोई तरीका है?

उत्तर

6

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

+0

वह था! धन्यवाद। –

2

एक सामान्य समाधान एक शेल स्क्रिप्ट रैपर बनाने के लिए है जो निष्पादन योग्य निर्देशिका में है और वास्तविक निष्पादन योग्य निष्पादन करने से पहले उचित रूप से LD_LIBRARY_PATH सेट करता है।

+3

एक आम लेकिन गंदा समाधान, लोगों को आरपीएथ के बारे में सीखना चाहिए – wich

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