2012-04-05 6 views
15

Wenn Sie versuchen, dynamische Verknüpfung zu verstehen, ist wahrscheinlich this question von Interesse.MacOS - wie man eine dynamische Bibliothek mit einem relativen Pfad verbindet mit gcc/ld

Eine der Antworten auf diese Frage bietet ein wunderbares Beispiel für die Erstellung und Verwendung einer dynamischen Bibliothek. Basierend auf, ich einige einfache Dateien:

main.c:

extern void someFunction (int x); 

int main (int argc, char** argv) { 
    someFunction(666); 
} 

mylibrary.c:

#include <stdio.h> 

void someFunction (int x) { 
    printf ("\nsomeFunction called with x=%d\n", x); 
} 

Make-Datei:

main: mylibrary.c main.c 
    gcc -c mylibrary.c 
    gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib 
    gcc -c main.c 
    gcc -v main.o ./libmylibrary.dylib -o main 

clean: 
    rm *.o 
    rm main 
    rm *.dylib 

Bisher alles funktioniert super . Wenn ich machen und dann an der Eingabeaufforderung eingeben ./main, sehe ich die erwartete Ausgabe:

someFunction called with x=666 

Nun, ich möchte die Dinge mischen ein wenig. Ich habe ein Verzeichnis namens hideLib erstellt, welches ein Unterverzeichnis meines Hauptverzeichnisses ist. Und ich bin das Hinzufügen einer Zeile zu meinem Make-Datei:

main: mylibrary.c main.c 
    gcc -c mylibrary.c 
    gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib 
    gcc -c main.c 
    mv libmylibrary.dylib hidelib  # this is the new line 

clean: 
    rm *.o 
    rm main 
    rm hidelib/*.* 

Nun, ich möchte eine andere Linie auf die Make-Datei hinzufügen, damit es libmylibrary.dylib im hidelib Unterverzeichnis finden. Ich möchte in der Lage sein, ./main auf die gleiche Weise auszuführen. Wie kann ich das machen?

EDIT: Danke für die Antwort. Viele Optionen zu haben ist wunderbar, aber ein Anfänger will nur eine konkrete Option, die funktioniert. Hier ist, was ich für die letzte Zeile versuche, aber klar verstehe ich etwas nicht. Das Makefile wird ohne Fehler ausgeführt, aber zur Laufzeit wird "Bibliothek nicht gefunden" angezeigt.

gcc main.o -rpath,'$$ORIGIN/hidelib' -lmylibrary -o main 

Antwort

13

Eine konkrete Option, die funktioniert, wäre die install_name Flag bei der Verknüpfung der .dylib setzen.

gcc -dynamiclib -install_name '$(CURDIR)/hidelib/libmylibrary.dylib' -current_version 1.0 mylibrary.o -o libmylibrary.dylib 

Dann können Sie verbinden einfach in die Bibliothek normalerweise:

gcc main.o -L '$(CURDIR)/hidelib' -lmylibrary -o main 
7

Sie müssen wahrscheinlich die -L Compiler/Linker-Flag, die für Bibliotheken zum Suchpfad hinzufügt.

Wenn Sie versuchen, Dinge nach dem Verknüpfen zu verschieben, benötigen Sie eine dyld Umgebungsvariable für die Suche. man dyld und Sie sollten in der Lage sein, weitere Informationen zu DYLD_LIBRARY_PATH und anderen Umgebungsvariablen zu erhalten.

Normalerweise aber stellen Sie den Namen der Bibliothek installieren, bevor mit dem -install_name Linker-Flag auf so etwas wie @rpath/mylibrary.dylib als der Wert auf etwas verknüpfen, setzen Sie dann die Laufpfad Suchpfade auf dem Hauptprogramm während der -rpath Flag kompiliert zu @executable_path/hidelib.

Weitere Informationen finden Sie install_name_tool und die -rpath & -install_name Argumente von ld.

Im Grunde gibt es viele Optionen für das, was Sie versuchen zu tun.

Verwandte Themen