clang, ändere den Namen der abhängigen Bibliotheksinstallation zur Verbindungszeit

8

Related, aber beantworten Sie die Frage nicht:

Unter OSX habe ich eine dynamische Bibliothek, die von einem Packager-Manager zur Verfügung gestellt wird und in einem nicht-installierten System installiert ist Standardverzeichnis, wobei install_name nur der Dateiname ist. Zum Beispiel:

%Vor%

Ich möchte nicht ändern (absoluter Pfad, @RPATH, ...) den Installationsnamen von libfoo.dylib mit install_name_tool -id .

Jetzt verbinde ich ein Programm mit der Bibliothek, zum Beispiel:

%Vor%

Das Programm kann nicht ausgeführt werden:

%Vor%

weil:

%Vor%

Ich kann den Pfad der abhängigen Bibliothek ändern:

%Vor%

so:

%Vor%

und das Programm kann ausführen:

%Vor%

Gibt es eine clang-Option, die ich dem Befehl hinzufügen kann:

%Vor%

um zu vermeiden, dass Sie Folgendes ausführen müssen:

%Vor%

Hinweis: Ich möchte DYLD_LIBRARY_PATH oder eine andere Umgebungsvariable nicht ändern.

?

    
user744629 16.12.2014, 14:04
quelle

1 Antwort

10

Ich habe mir schon seit einiger Zeit den Kopf darüber geschlagen und denke, dass ich endlich herausgefunden habe, wie das geht, ohne install_name_tool zu benutzen, zumindest für Mac OS 10.9 und später (soweit ich es getestet habe).

Vielleicht hast du es schon herausgefunden, aber ich poste es hier, falls es jemand anderes braucht.

Grundsätzlich haben Sie zwei Möglichkeiten:

  1. Sie können es tun, wenn Sie die Bibliothek kompilieren und ihr install_name in @executable_path definieren
%Vor%
  1. Oder Sie können es in zwei Schritten tun, indem Sie @rpath verwenden, das Sie dann beim Kompilieren der ausführbaren Datei festlegen:
%Vor%

Das Endergebnis ist in beiden Fällen dasselbe:

%Vor%

Der zweite ist wahrscheinlich vorzuziehen, da Sie dann die Bibliothek einmal kompilieren können und jede ausführbare Datei, die sie verwendet, definieren, wo sie sie laden wird, indem sie ihre eigene rpath verwendet.

Lesen Sie hier , um detaillierte Erläuterungen zu @executable_path , @rpath und @load_path zu erhalten. (die ich hier nicht benutzt habe).

    
Johannes 05.08.2015 06:23
quelle