2010-12-22 8 views
40

Ich möchte unter Mac OSX den Laufzeitpfad einer ausführbaren Datei (für den Linker) zur Kompilierungszeit festlegen, so dass gemeinsame Bibliotheken an nicht standardmäßigen Speicherorten vom dynamischen Linker beim Programmstart gefunden werden.Wie setze ich den Laufzeitpfad (-rpath) einer ausführbaren Datei mit gcc unter Mac OSX?

Unter Linux ist dies möglich mit -Xlinker -rpath -Xlinker /path/to (oder -Wl,-rpath,/path/to) und unter Solaris können Sie -R/path/to der Compiler-Befehlszeile hinzufügen.

Ich fand some information, die Mac OS X gcc -rpath Unterstützung seit 10.5 hat, also seit ~ 2008

I zu erhalten versuchte es mit einem minimalen Beispiel arbeiten - ohne Erfolg:

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

Und :

$ cat main.c 

#include <stdio.h> 

int blah(int); 

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

es so Zusammengestellt:

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

Nun wird der Test:

$ 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 

So ist die Frage: Wie ich den Laufzeitpfad für den Linker unter Mac OSX gesetzt?

Btw, Einstellung DYLD_LIBRARY_PATH funktioniert - aber ich möchte diesen Hack nicht verwenden.

Edit: In Bezug auf 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) 

Es scheint, dass otool -L nur die Bibliotheksnamen druckt (und wahrscheinlich die Positionen zur Verknüpfungszeit) die ausführbaren Datei gegen und ohne Laufzeitpfadinformationen verlinkt.

+0

Ich habe nicht ein OS X-System haben, aber die Suche um, [install_name_tool] (http://developer.apple.com/ library/mac/# documentation/Darwin/Referenz/ManPages/man1/install_name_tool.1.html) kann rpaths zu Ihrer Binärdatei hinzufügen. Nicht sicher, warum deine nicht funktioniert - was sagt "Otool-L"? – ephemient

Antwort

32

durch Experimentieren gefunden, und für einen die Befehlszeilen Inspektion reference rpath demo project by Dave Driblin von Xcode erzeugt:

otool -L zeigt Ihnen den Namen der verknüpften Bibliotheken installieren. Um @rpath zu arbeiten, müssen Sie den Namen der Bibliothek installieren ändern:

$ 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

Ja, das funktioniert. Angesichts der Tatsache, dass es eine Semantik von -rpath auf einem anderen Unix-ähnlichen Betriebssystem gibt, scheint die von Apples abweichende Implementierung etwas peinlich zu sein. Zumindest sollten sie es in ihrer Version der gcc man-page dokumentieren. – maxschlepzig

+0

@Karel ist korrekt, aber [dies] (http://dev.lsstcorp.org/trac/wiki/LinkingDarwin) könnte auch hilfreich sein, wenn Sie eine vollständigere Liste von Alternativen wünschen. – cdunn2001

Verwandte Themen