Frage

Ich sitze in einer Umgebung, über die ich keine wirkliche Kontrolle habe (es bin nicht nur ich, also kann ich die Umgebung nicht ändern oder es funktioniert für niemanden), das einzige, was ich beeinflussen kann, ist, wie die Binär wird gebaut.

Mein Problem ist, dass die Umgebung einen ld_library_path mit einem libstdc ++ enthält, das nicht mit dem verwendeten Compiler kompatibel ist. Ich habe versucht, es statisch zu kompilieren, aber das scheint für G ++ nicht möglich zu sein (Version 4.2.3, scheint in späteren Versionen in dieser Richtung gearbeitet zu haben, die jedoch nicht verfügbar sind, -static -libstdc ++ oder ähnliches).

Jetzt bin ich angekommen, um RPath zu verwenden, um den absoluten Pfadnamen in die ausführbare Datei zu backen (würden alle Maschinen funktionieren, auf denen er laufen soll, sind identisch). Leider sieht es so aus, als ob LD_LIBRARY_PATH Vorrang vor RPATH hat (zurückzusetzen ld_library_path bestätigt, dass sie in der Lage ist, die Bibliothek zu finden, aber wie oben erwähnt, wird ld_library_path für alle festgelegt, und ich kann das nicht ändern).

Gibt es eine Möglichkeit, dass ich RPath vor LD_LIBRARY_PATH vorrangigen kann, oder gibt es andere mögliche Lösungen für mein Problem? Beachten Sie, dass ich zur Laufzeit über dynamische Verknüpfungen spreche. Ich kann die Befehlszeile bei Compile und Link Time steuern.

Vielen Dank.

War es hilfreich?

Lösung

Verknüpfung gegen libstdc++.a ist definitiv möglich, wenn auch schwierig. Anweisungen hier.

Ich bin ein bisschen skeptisch gegenüber Ihrer Behauptung, das LD_LIBRARY_PATH Nimmt Vorrang vor dem "gebackenen" Vorrang DT_RPATH Allerdings - zumindest unter Linux und (ich glaube) Solaris, LD_LIBRARY_PATH wird erst danach betrachtet DT_RPATH Die Suche ist gescheitert.

Andere Tipps

Vielleicht können Sie einen Shell -Wrapper verwenden, der die Umgebung für nur dieses Programm verändert?

#!/bin/sh

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@

Dies sollte vor der Ausführung den ld_library_path überladen und dann den Wrapper durch EXEC durch die Binärdatei ersetzen.

Würde das helfen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top