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