2010-12-22 11 views
40

मैं संकलन समय पर निष्पादन योग्य (लिंकर के लिए) के रनटाइम पथ के मैक ओएसएक्स के तहत सेट करना चाहता हूं, जैसे गैर-मानक स्थानों पर साझा लाइब्रेरी प्रोग्राम प्रारंभ में गतिशील लिंकर द्वारा पाई जाती हैं।मैक ओएसएक्स के तहत जीसीसी के साथ निष्पादन योग्य के रनटाइम पथ (-rpath) को कैसे सेट करें?

लिनक्स के तहत -Xlinker -rpath -Xlinker /path/to (या -Wl,-rpath,/path/to का उपयोग करके) के साथ संभव है और सोलारिस के तहत आप संकलक कमांड लाइन में -R/path/to जोड़ सकते हैं।

मैंने पाया some information मैक ओएस एक्स जीसीसी 10.5 के बाद से -rpath समर्थन, है कि IE ~ 2008

के बाद से मैं इसे एक न्यूनतम उदाहरण के साथ काम करने के लिए कोशिश की - सफलता के बिना:

$ cat blah.c 
int blah(int b) 
{ 
    return b+1; 
} 

और :

$ cat main.c 

#include <stdio.h> 

int blah(int); 

int main() 
{ 
    printf("%d\n", blah(22)); 
    return 0; 
} 

इसे इस तरह संकलित:

$ gcc -c blah.c 
$ gcc -dynamiclib blah.o -o libblah.dylib 
$ gcc main.c -lblah -L`pwd` -Xlinker -rpath -Xlinker `pwd`/t 

अब टेस्ट:

$ mkdir t 
$ mv libblah.dylib t 
$ ./a.out 
dyld: Library not loaded: libblah.dylib 
    Referenced from: /Users/max/test/./a.out 
    Reason: image not found 
Trace/BPT trap 

इस प्रकार प्रश्न: मैं मैक OSX के तहत लिंकर के लिए क्रम पथ सेट करने के लिए कैसे?

बीटीडब्ल्यू, DYLD_LIBRARY_PATH सेटिंग सेट करना - लेकिन मैं इस हैक का उपयोग नहीं करना चाहता हूं।

संपादित करें:otool -L के बारे में:

$ otool -L a.out 
a.out: 
     libblah.dylib (compatibility version 0.0.0, current version 0.0.0) 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) 

ऐसा लगता है कि otool -L केवल (लिंक समय में और संभावित स्थानों पर) पुस्तकालय के नाम प्रिंट निष्पादन और कोई क्रम पथ जानकारी के खिलाफ जोड़ा गया था।

+0

मैं एक ओएस एक्स प्रणाली लेकिन चारों ओर खोज, [install_name_tool] (http://developer.apple.com/ की जरूरत नहीं है लाइब्रेरी/मैक/# प्रलेखन/डार्विन/संदर्भ/मैनपेज/मैन 1/install_name_tool.1.html) आपके बाइनरी में आरपीएथ जोड़ सकते हैं। सुनिश्चित नहीं है कि आपका काम क्यों नहीं कर रहा है - 'otool -L' क्या कहता है? – ephemient

उत्तर

32

प्रयोगों के द्वारा पाया जाता है, और कमांड लाइन एक reference rpath demo project by Dave Driblin के लिए Xcode द्वारा उत्पन्न निरीक्षण:

otool -L आप लिंक किए गए पुस्तकालयों का नाम स्थापित पता चलता है। @rpath प्राप्त करने के लिए काम करने के लिए, आप पुस्तकालय के नाम स्थापित बदलने की जरूरत:

$ gcc -dynamiclib blah.o -install_name @rpath/t/libblah.dylib -o libblah.dylib 
$ mkdir t ; mv libblah.dylib t/ 
$ gcc main.c -lblah -L`pwd`/t -Xlinker -rpath -Xlinker `pwd` 
+1

हां, यह काम करता है। यह देखते हुए कि अन्य यूनिक्स-जैसे ओएस पर -प्रैथ के मौजूदा अर्थशास्त्र हैं, कार्यान्वयन विचलन करने वाले सेब थोड़ा अजीब लगता है। कम से कम उन्हें इसे जीसीसी मैन-पेज के अपने संस्करण में दस्तावेज करना चाहिए। – maxschlepzig

+0

@ करेल सही है, लेकिन [यह] (http://dev.lsstcorp.org/trac/wiki/LinkingDarwin) भी सहायक हो सकता है, यदि आप विकल्पों की एक और पूरी सूची चाहते हैं। – cdunn2001