2013-11-04 12 views
5

Ich bin ein Neuling in diesem Bereich. Mein Laptop ist Macbook Air, Software: OS X 10.8.5 (12F45). Ich führe einen Code, der mir den folgenden Fehler gibt:Fehler: dlopen() Bibliothek nicht geladen Ursache: Bild nicht gefunden

dlopen(/Users/ramesh/offline/build_icerec/lib/icecube/phys_services.so, 2): Library not loaded: /Users/ramesh/offline/build_icerec/lib/libphys-services.dylib Referenced from: /Users/ramesh/offline/build_icerec/lib/icecube/phys_services.so Reason: image not found

Ich habe Google-Suche und fand eine Vielzahl von Antworten. Ich denke, dass derjenige, der

" -install_name @rpath/lib ".

Meine Frage zu verwenden, funktioniert, ist, ist, wie -install_name @rpath/lib in meinem Fall zu benutzen?

+0

Ich hatte das gleiche Problem nach der Installation von xcode 8, während der Verwendung von binding.pry in Ruby. Nach der Neuinstallation von Ruby, alles hat gut funktioniert. Scheint einfacher als die komplexe, aber korrekte Antwort von mah. 'rvm requirements' haben mir auch geholfen, weil ich kürzlich mein System aktualisiert habe. – Johannes

Antwort

13

Der Speicherort für freigegebene Objekte unter OS X ist manchmal schwierig. Wenn Sie direkt dlopen() aufrufen, haben Sie die Freiheit, einen absoluten Pfad zur Bibliothek anzugeben, was gut funktioniert. Wenn Sie jedoch eine Bibliothek laden, die wiederum eine andere lädt (wie es Ihrer Situation entspricht), haben Sie die Kontrolle darüber verloren, wo die Bibliothek mit ihrem direkten Pfad lebt.

Es gibt Umgebungsvariablen, die Sie vor mit Ihrem Hauptprogramm festlegen können, die dem dynamischen Lader sagen, wo nach Dingen zu suchen ist. Im Allgemeinen sind diese eine schlechte Idee (aber Sie können über sie über den Manndyl Befehl auf einem OS X System lesen).

Wenn eine dynamische OS X-Bibliothek erstellt wird, erhält sie einen Installationsnamen. Dieser Name ist in die Binärdatei eingebettet und kann mit dem Befehl otool angezeigt werden. otool -L mach-o_binary listet die dynamischen Bibliotheksreferenzen für die mach-o-Binärdatei auf, der Sie den Dateinamen geben; Dies kann zum Beispiel eine primäre ausführbare Datei oder eine dylib sein.

Wenn eine dynamische Bibliothek statisch in eine andere ausführbare Datei (entweder eine primäre ausführbare Datei oder eine andere dylib) verknüpft ist, wird der erwartete Speicherort der verknüpften dylib auf dem Speicherort (entweder zu der Zeit) festgelegt wurde gebaut, oder Änderungen, die danach angewendet wurden). In Ihrem Fall scheint phys_services.so statisch mit libphys-services.dylib verknüpft zu sein. Also starten Sie otool -L phys_services.so, um die genaue Erwartung zu finden, wo die Dylib sein wird.

Der Befehl install_name_tool kann verwendet werden, um den erwarteten Speicherort einer Bibliothek zu ändern. Es kann gegen die Dylib laufen, bevor es statisch verlinkt wird (in diesem Fall hast du nichts mehr zu tun), oder es kann gegen die ausführbare Datei laufen, die es lädt, um diese Erwartungen neu zu schreiben. Das Befehlsmuster hierfür lautet install_name_tool -change <old_path> <new_path>. Wenn also zum Beispiel otool -L phys_services.so/usr/lib/libphys-services.dylib anzeigt und Sie die Erwartung verschieben möchten, wie Sie in Ihrer Frage gestellt haben, würden Sie das mit install_name_tool -change /usr/lib/libphys-services.dylib @rpath/lib/libphys-services.dylib phys_services.so tun.

Die dyld man-Seite (man dyld) wird Ihnen sagen, wie @rpath verwendet wird, sowie andere Makros @ loader_path und @executable_path.

+0

Sie können auch versuchen, die Option '-Wl, -rpath, $ {RPATH}' an den Linker zu übergeben, wobei '$ {RPATH}' der Pfad zu einer Bibliothek ist, wie '/ foo/bar/lib'. Mehrere solcher Optionen können angegeben werden und der Linker sucht nach den dynamischen Bibliotheken an all diesen Orten. –

Verwandte Themen