2014-01-09 13 views
6

Ich baue mein Programm auf meinem Computer, auf dem libtiff.so -> libtiff.so.5. Und dann schieben Sie die Builds auf einer anderen Maschine, auf der libtiff.so -> libtiff.so.4.Wie kann ich eine ältere Version einer gemeinsamen Bibliothek verknüpfen

Zur Laufzeit existiert mein Programm: «Fehler beim Laden von gemeinsam genutzten Bibliotheken: libtiff.so.5: kann gemeinsame Objektdatei nicht öffnen: Keine solche Datei oder Verzeichnis».

Ich kann die andere Maschine nicht aktualisieren, und ich möchte vermeiden, auf einer virtuellen Maschine zu kompilieren (mit der gleichen Linux-Version als die ausführende Maschine). Daher möchte ich den Compiler zwingen, libtiff.so.4 statt libtiff.so.5 zu verwenden.

Ich habe libtiff.so.4 auf meinem Computer installiert (sowie libtiff.so.5). Wie kann ich die Verknüpfung mit dieser Version anstelle der neueren Version erzwingen? Ich dachte über das Verschieben der libtiff.so -> libtiff.so.4, aber ich habe Angst, mein System zu brechen, wenn es die neueste Version benötigt (apt-get purge libtiff5 gibt einen Fehler, weil ein anderes Paket es benötigt).

Ist es möglich, mit einer älteren (installierten) Version einer Bibliothek zu verknüpfen? Wenn ja, wie? Und ist es schädlich, die symbolische Verbindung von libtiff.so zu der älteren Version zu ändern? Wenn nicht, wird es mein Problem lösen?

+0

Vielleicht mit [LD_PRELOAD] (http://en.wikipedia.org/wiki/Dynamic_linker). – jml

+0

Wie wäre es mit dem vollständigen Pfad zu .so.4 anstelle des üblichen "-liff" beim Verknüpfen? (Sie müssten auch gegen libtiff4-kompatible Header kompilieren). –

+0

Der Compiler kann den Speicherort der gemeinsam genutzten Bibliothek nicht finden. Ich schätze, du musst den PATH auch bestehen. –

Antwort

2

können Sie diese Syntax verwenden, um eine bestimmte Version einer Bibliothek zu verknüpfen:

 
gcc [other options] -l:libtiff.so.4 

Sie müssen keinen Pfad angeben; Die üblichen Verzeichnisse werden durchsucht, um die Bibliothek zu finden.

Hinweis: Wie Michael Wild erwähnt, sollten Sie die Header-Dateien für diese Version anstelle der neuesten installiert haben.

+0

Können Sie darauf hinweisen, wo diese Funktion dokumentiert ist? Irgendwie habe ich es versäumt, es aus der 'gcc'-Dokumentation nachzuschlagen. – cmaster

+0

@cmaster Es ist im Linker ('man ld') dokumentiert. Suchen Sie nach der Option "-l". –

+0

Ah, habe es gefunden. Vielen Dank. – cmaster

0

Geben Sie den vollständigen Pfad zum .so an: anstelle von -ltiff übergeben Sie /lib64/libtiff.so.4 an den Linker.

1

Wie andere bereits erwähnt haben, können Sie den Linker erzwingen, indem Sie den vollständigen Versionsnamen oder sogar den absoluten Pfad angeben.

Allerdings würde ich stark davon abraten, dies zu tun. Das Problem ist, dass die installierten Header der neueren Version der Bibliothek entsprechen. Wenn zwischen diesen Bibliotheksversionen Änderungen an API/ABI aufgetreten sind, funktioniert das Programm möglicherweise, stürzt ab und oder, wenn Sie Glück haben, überhaupt nicht.

Stattdessen sollten Sie das Entwicklungspaket vorübergehend installieren, das der Bibliothek libtiff.so.4 entspricht. Unter Debian/Ubuntu oder ähnlich wäre dies das libtiff4-dev Paket.

Verwandte Themen