Frage

Ich versuche, eine RPATH mit dem speziellen Zeichenfolge $ ORIGIN in eine ausführbare Datei zu verknüpfen GCC mit dem Code gebaut mit :: Blocks IDE. Ich habe angegeben

-Wl,-R$ORIGIN

in den Linker-Optionen für das Projekt, aber die Befehlszeile Ausgabe an GCC ist falsch (der Klarheit halber gestrippt):

g++ -Wl,-R

Was ist der richtige Weg, um dieses Argument für Code :: Blocks angeben?

War es hilfreich?

Lösung

Wer entschied das Token $ ORIGIN zu machen, ist ein böser Bastard, der einen besonderen Platz in der Hölle Programmierer verdient. Seit ‚$‘ für bash und andere Skript ein Sonderzeichen Sprachen wie machen ist, es Schrauben alles, es sei denn sorgfältig entkommen. Noch schlimmer ist, je nachdem, welche Build-Umgebung Sie verwenden, die Besonderheiten, wie man richtig entkommen wird wahrscheinlich ändern.

In der bash, benötigen Sie einen umgekehrten Schrägstrich vor dem $ halten:

-Wl,-R\$ORIGIN

Code :: Blocks scheinbar behandelt auch die $ als Sondermüll. Dann was subprocess Controller Code :: Blocks sendet den Befehl, den umgekehrten Schrägstrich als Sondermüll zu behandeln. So wird sowohl die Backslash und der $ Bedarf verdoppelt werden bis zu richtig erhalten entkommen. Daher wird in Code :: Blocks Linker-Einstellungen, müssen Sie angeben:

-Wl,-R\\$$ORIGIN

... welche Ausgänge:

-Wl,-R\\$ORIGIN

... zum Buildprotokoll, aber die Schale tatsächlich gesendet wird:

-Wl,-R\$ORIGIN

..., die wie oben erwähnt, erzeugt das gewünschte Ergebnis.

Was für ein Schmerz.

Andere Tipps

Neben kblucks Antwort, die die Frage Code-Adressen: Blöcke .... Für wie ich diejenigen, die über diese Seite gestolpert suchen, wie dies zu tun, mit zu machen. Der Trick ist, ein zusätzliches $ Zeichen als Escape-Zeichen zu verwenden und sie mit Anführungszeichen setzen:

-Wl,-R,'$$ORIGIN/../lib'

Vollständige Erklärung kann hier gehabt werden: ORIGIN Verwendung für eine dynamische Laufzeit Bibliothekssuchpfad

Wenn die ausführbare Datei von einem riesigen komplexen Skriptumgebung aufgebaut wird nicht von Ihnen erstellt, und Sie wollen nicht in vertiefen damit, versuchen, mit setenv LD_RUN_PATH='$ORIGIN/../lib' läuft; Wenn das nicht funktioniert, ein pragmatischer Ansatz ist es, einen Wrapper für ld zu erstellen:

#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"

... dann tun, um die Build mit dem Stummel auf dem Weg. In der Praxis kann es, oder andere ausführbare Dateien bauen .so-Dateien aufgerufen werden, so dass Sie dies ein komplexeres Skript, ob die RPATH einzufügen entscheidet müssen machen. OR, lief zu bauen, ohne dass dies, und mit und Kirsche-Pick.

(hier „/ usr / bin / ld“ ist der ld, die normalerweise ausgeführt worden wäre, die sonst irgendwo sein kann. Gcc nicht ld aus dem Weg abholen, gcc Umgebungsvariablen sehen, dass außer Kraft zu setzen. Kilometerstand variieren kann nur. Einmalgebrauch. Nicht als jeder anderer Ansatz als weniger schrecklich gerechtfertigt).

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