2016-05-04 5 views
0

Wie kann ich festlegen, dass eine bestimmte Bibliothek statisch verknüpft wird (in meinem Fall SDL2) und die Standardbibliothek dynamisch verknüpft wird?OSX: Wie kann man eine Bibliothek statisch verknüpfen und die Standardbibliothek dynamisch verknüpfen?

Die Verwendung von -static ist nicht gut, da der Linker versucht, auch die Standardbibliothek statisch zu verknüpfen, was in OSX verboten ist. Auf der anderen Seite weiß clang nicht -Wl,-Bstatic.

+0

Versuchen Sie, eine .dylib-Datei statisch mit Ihrem Programm zu verknüpfen? – zneak

+0

Die Bibliothek verfügt auch über eine .a-Version. (SDL2 in meinem Fall.) – Arcanelab

+0

Wenn Sie eine Bibliothek mit '-l' nach Clang übergeben, wird der Linker immer die .dylib über die .a-Datei auswählen, wenn es eine gibt. Dies ist ein Apple bekannter Fehler. Sie können es möglicherweise umgehen, indem Sie ein Dummy-Verzeichnis mit einer Kopie der Bibliothek (oder einem Link dazu) zum Bibliothekspfad hinzufügen. – zneak

Antwort

1

Legen Sie Ihre statischen Bibliotheken in, sagen wir, dir ./MyStaticLibs und einfach -L./MyStaticLibs/ -l<StaticLibraryName> verwenden.

Compiler bevorzugt dynamische Version über statische Version der Bibliothek

Wenn Sie Ihre dynamische Bibliothek (random.dylib) und statische Bibliothek (random.a) in demselben Verzeichnis haben, dann wird Compiler bevorzugen und einen Link mit .dylib nicht .a

1

Sie haben nur ein paar Optionen: -L für Verzeichnisse und -l für Bibliotheksnamen.

Sie können dies auf einfachste Weise tun, indem Sie sicherstellen, dass die statische Bibliothek, die Sie verknüpfen möchten, anders benannt ist als die dynamische Bibliothek. Andernfalls stellen Sie möglicherweise fest, dass der Linker hilfreich alle Verweise auf gemeinsam genutzte Bibliotheken nach Name und Verknüpfungen zu diese sammelt. Dies ist kein OSX-spezifisches Problem, sondern eine Funktion, die vielen Systemen mit gemeinsam genutzten Bibliotheken gemeinsam ist.

Ein Weg, um sicherzustellen, dass Sie die statische Bibliothek haben, wenn es normalerweise in einem Verzeichnis mit der genannten Bibliothek befindet, ist eine symbolische Verknüpfung in ein temporäres Verzeichnis zu erstellen, und verwenden Sie dass mit -L.

Etwas wie folgt aus:

MYDIR=$(mktemp -d -t xxxxxx) 
ln -sf /usr/local/libfoo.a ${MYDIR}/libfoo.a 
clang -o foo -L${MYDIR} -l foo 
rm -rf ${MYDIR} 
+0

Vielen Dank für Ihre hilfreichen Antworten, Leute! Sehr geschätzt. – Arcanelab