2016-07-02 9 views
1

Ich habe ein Projekt, das libibverbs verwendet. Ich muss dieses Projekt auf einem Server kompilieren, um es dort laufen zu lassen. Der Server hat libibverbs systemweit installiert, aber leider unterstützt er keine Funktion, die ich brauche.Wählen Sie die richtige Bibliothek Version

Ich entschied mich, meine eigene Version von Libibverbs zu kompilieren und zu verwenden, die die entsprechende Funktion hat. Also kompilierte ich die Bibliothek, installierte sie in meinem Home-Verzeichnis und aktualisierte folgende Umgebungsvariablen: PATH, LD_LIBRARY_PATH, C_INCLUDE_PATH, LIBRARY_PATH, CPLUS_INCLUDE_PATH

Jetzt muss ich mein Projekt kompilieren. Zuerst rufe ich konfigurieren und es schlägt mit folgenden Fehlermeldung:

conftest.c:(.text.startup+0x7): undefined reference to `ibv_open_xrc_domain' 

Dies ist das Symbol, das in der systemweiten Version fehlt, aber vorhanden ist, in der Version habe ich installiert. Der erste Eintrag in LIBRARY_PATH ist der Pfad zur neuen libibversion, also habe ich erwartet, dass er zuerst verwendet wird, aber es scheint, dass die alte Version trotzdem verwendet wird.

Der Kompilierungsbefehl, den ./configure verwendet, enthält das Flag -L/libibverbs/1.1.4/lib, das auf das Verzeichnis mit der neuen Bibliotheksversion verweist. Dieses Flag geht direkt hinter -L/usr/lib /../ lib64, die auf das Verzeichnis verweisen, mit systemweiten Libibverbs.

Wenn ich -L mit der neuen Version am Ende des Befehls setze, kompiliert der conftest erfolgreich. https://gist.github.com/planetA/a421669269b14e69026c53f56fa45b2b

Und folgende Werke: https://gist.github.com/planetA/3b0e22bf6aca3a1c67f30bfa3666d9a8

Können Sie mir helfen, die neue Version der Bibliothek in einer Art und Weise zu erzwingen Kommissionierung, die Fänge es konfigurieren

Um klar folgenden nicht zu sein?

+0

Sie müssen die 'configure.ac' des Projekts ändern, aus dem das'./Configure' Skript erstellt wird, und Sie müssen es veröffentlichen, wenn Sie zuverlässige Ratschläge dazu benötigen. –

+0

Aber warum wird die neue Bibliothek nicht von LIBRARY_PATH erfasst? Ist es ein bestimmtes Verhalten? Oder mache ich etwas völlig Seltsames? – mcsim

+0

Es gibt kein -L/home/irgendetwas in der ersten Zeile. Wie erwarten Sie, dass es funktioniert? –

Antwort

1

LD_LIBRARY_PATH spezifiziert Verzeichnisse werden durchsucht, bevor die Standardwerte, für eine Bibliothek, die in einem Prozess bei Laufzeit geladen werden soll. Es wirkt sich nicht auf die Verzeichnisse aus, die nach einer Bibliothek durchsucht werden , um es unter buildtime zu verknüpfen.

Die Linker suchen nach Bibliotheken in den Verzeichnissen, die mit der -Ldir Option in seiner Kommandozeile angegeben werden, bevor es seine Verzeichnisse Standardsucht. Ihr Skript configure testet, ob es eine libibverbs-Bibliothek im Linker Suchverzeichnisse finden kann, die die Funktion ibv_open_xrc_domain definiert, und schlägt fehl, weil es nicht möglich ist. Der Wert von LD_LIBRARY_PATH ist spielt keine Rolle für diesen Test.

Für GNU make die -L -Optionen es an den Linker werden üblicherweise angegeben in den Umgebungsvariablen LDFLAGS passieren soll. GNU autoconf - die generiert Ihr configure Skript - folgt dieser Konvention. autoconf generiert das configure Skript aus der Datei configure.ac des Projekts.

Also, wenn Ihr wollen Ihr geändertes Paket ein ein configure Skript so zu erzeugen, erzeugen, dass ./configure läuft wiederum Makefiles generieren in denen -L/my/library/Version/is/hier an den Linker übergeben wird dann müssen Sie das Projekt configure.ac wie ändern:

LDFLAGS="$LDFLAGS -L/my/library/version/is/here" 

und Sie dies im configure.ac tun müssen, bevor sie den Test für die libibverbs läuft Bibliothek . Nachdem Sie diese Änderung vorgenommen haben, müssen Sie das Paket neu konfigurieren, indem Sie im Projektverzeichnis autoreconf ausführen, um das Skript configure zu regenerieren.

Wenn Sie nicht die configure.ac wie dies ändern möchten, dann können Sie den gleichen Effekt durch erzielen:

./configure LDFLAGS="$LDFLAGS -L/my/library/version/is/here" 

oder:

export LDFLAGS="$LDFLAGS -L/my/library/version/is/here" 
... # in same shell or a subshell 
./configure 

Dann bis zum nächsten Mal laufen Sie configure Skript des Projekts Makefiles wird -L/my/library/version/is/here an den Linker übergeben. Aber das nächste Mal Sie ./configure ausführen müssen Sie daran denken, LDFLAGS in der gleichen Weise oder setzen die generierten Makefiles werden auf das Standardverhalten zurückgesetzt.

+0

Beide Ansätze ./configure LDFLAGS = ... und Einstellung von LDFLAGS vor dem Aufruf von Autoconf-Arbeit. Vielen Dank! – mcsim

Verwandte Themen