2016-05-14 5 views
1

Ich versuche, eine C++ - Bibliothek mit dem G ++ - Compiler zu generieren. Meine Bibliothek hat eine andere C-Bibliothek als Abhängigkeit und ich habe sie kompiliert, um die .so-Dateien zu erhalten.g ++ nicht finden .so Dateien

Ich habe die folgende Struktur:

src: 
    include/linux: 
     libcustom.a 
     libcustom.la 
     libcustom.so 
     libcustom.so.0 
     libcustom.so.0.0.0 

Nun, wenn ich all .o Dateien meiner CPP-Klassen, und ich möchte, um die Bibliothek zu verknüpfen, führe ich den folgenden Befehl ein:

g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o mylibrary.so File1.o File2.o File3.o -L./include/linux -lc++ -lutil -lm -lcustom -Wl,-rpath='$ORIGIN/include/linux' -L/usr/lib/R/lib -lR 

Aber es wirft mich den Fehler:

libcustom.so.0: cannot open shared object file: No such file or directory 

ich Ausführung des Befehls aus dem src Verzeichnis.

Ich weiß, es könnte behoben werden Bearbeitung der LD_LIBRARY_PATH, aber die Idee, es ist jemand kann meine Bibliothek ohne die Notwendigkeit, etwas zu konfigurieren, so versuche ich das mit dem C++ 's -rpath-Flag zu tun.

Eine Idee, wie kann ich es beheben, oder der Grund für den Fehler?

+0

Sie relativen Pfad verwenden '-Wl, -rpath =./Include/linux', die durch nicht erkannt der 'ld'-Loader unter Linux. Verwenden Sie stattdessen den absoluten Pfad. Für die korrekte Art der Verwendung des relativen Pfads, gehen Sie http://StackOverflow.com/A/4018559/6238076 – gdlmx

Antwort

2

Die Fehlermeldung, die Sie erhalten, scheint von der Laufzeit-Ladeprogramm ld.so anstelle des Linkers ld kommen (ich weiß, die Namen sind verwirrend). Sie müssen unterscheiden zwischen der Suche nach so genannten Links und der Laufzeit. Das -L-Flag, das Sie zur Verknüpfungszeit angeben, hat nichts mit der Lokalisierung der Bibliothek zur Laufzeit zu tun.

Ihr rpath=./include/linux Wert ist nicht korrekt, weil Punkt nicht von ld als relativer Pfad erkannt wird. Relative Suchpfad sollte wie

-Wl,-rpath='$ORIGIN/include/linux' 

gegeben, in dem die $ORIGIN repräsentiert den Ordner, in dem ausführbare (nicht mylibrary.so) lokalisiert. Stellen Sie sicher, einzelnes Angebot und nicht doppelte Anführungszeichen zu verwenden, da die Zeichenfolge $ORIGIN an den Linker buchstäblich übergeben und in der ausführbaren Datei fest codiert werden sollte.

Mehr Details geht

  1. how to link to shared lib from shared lib with relative path

  2. ld: Using -rpath,$ORIGIN inside a shared library (recursive)

+0

Sie sind völlig richtig, das ist das Problem, denn jetzt habe ich getestet, um die -rpath ändern, die den absoluten Pfad der Bibliothek angibt und es funktioniert. Aber '$ ORIGIN' funktioniert nicht für mich, weil ich eine Makevars-Datei verwende und sie den -rpath von' -Wl, -rpath = "'$$ ORIGIN/include/linux'" zu '" übersetzt " -Wl, -rpath = "'/ include/linux'" '. Ich habe die Webseite in dem von Ihnen vorgeschlagenen Beitrag gelesen und kann keine Lösung finden. Weißt du wie ich es beheben kann?Vielen Dank –

+1

In Makefile müssen Sie das '$' Symbol mit '$$' entkommen: das ist '-rpath = '$$ ORIGIN/include/linux'' – gdlmx

+1

Sie müssen auch den Pfad nicht doppelt angeben , verwenden Sie nur ein Anführungszeichen. Überprüfen Sie das Echo Ihres make-Befehls und stellen Sie sicher, dass der Parameter korrekt an g ++ übergeben wird. – gdlmx