Ein häufiger Fall ist statische Verknüpfung mit einer dritten Benutzerbibliothek bei gleichzeitiger dynamischer Verknüpfung mit den System-Frameworks und Bibliotheken, so dass Ihre Benutzer keine Bibliotheken von Drittanbietern installieren müssen, bevor sie Ihr Programm verwenden. Wenn die Bibliothek dynamisch gegen Frameworks gelinkt ist (was oft der Fall ist), kann sie immer noch mit einer statischen .a ausgeliefert werden, aber es reicht nicht aus, nur die -l<libname>
con /path/to/libname.a
weil die .a-Datei die Abhängigkeiten nicht enthalten wird. Sie müssen auch dynamisch gegen die Frameworks linken, die Ihre Bibliothek verwendet hat.
Nehmen wir an, Sie wollen ein Programm schreiben, das die Open-Source-Libusb verwendet, ohne dass der Benutzer die Libusb herunterladen und installieren muss. Nehmen wir an, Sie haben eine dynamisch gelinkte Binärdatei, die Sie mit dieser erstellt haben:
clang -lusb-1.0 main.c -o myprogram
Um unter OS X statisch zu linken, sieht der Befehl wie folgt aus (beachten Sie das -framework
Argumente):
clang -framework CoreFoundation -framework IOKit main.c /path/to/libusb-1.0.a -o myprogram
Um herauszufinden, welche System-Frameworks und -Bibliotheken Sie hinzufügen müssen, sehen Sie sich die Drittanbieter-Dylib mit otool an:
otool -L /usr/local/opt/libusb/lib/libusb-1.0.0.dylib
die zeigt:
/usr/local/opt/libusb/lib/libusb-1.0.0.dylib:
/usr/local/opt/libusb/lib/libusb-1.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
Sie können damit beginnen, die Frameworks hinzuzufügen, gefolgt von den Bibliotheken, eine nach der anderen, und Sie werden sehen, dass die Liste der undefinierten Referenzfehler kleiner wird. Beachten Sie, dass Sie wahrscheinlich nicht jede Bibliothek hinzufügen müssen, da einige als Abhängigkeiten für die von Ihnen explizit hinzugefügten Bibliotheken geladen werden können.
Wenn Sie nicht sicher sind, wo die Dylib existiert, erstellen Sie Ihr Programm auf die ursprüngliche dynamische Weise (mit -lusb-1.0) und führen Sie otool darauf aus:
clang -lusb-1.0 main.c -o myprogram
otool -L myprogram
das ergibt:
myprogram:
/usr/local/opt/libusb/lib/libusb-1.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
Lesen Sie auch die Lizenz der Bibliothek, auf die Sie verlinken wollen.
3 Stimmen
Die blöden Apple-Dokumente empfehlen dynamisches Linken, aber sie zeigen keine
ld
Befehl, der dies tatsächlich tut.