2016-05-04 1 views
0

Comment est-ce que je spécifie clang pour relier statiquement une certaine bibliothèque (dans mon cas SDL2) et relie dynamiquement la bibliothèque standard?OSX: Comment lier statiquement une bibliothèque et lier dynamiquement la bibliothèque standard?

L'utilisation de -static n'est pas bonne, car l'éditeur de liens tente également de lier statiquement la bibliothèque standard, ce qui est interdit dans OSX. D'autre part, clang ne sait pas -Wl,-Bstatic.

+0

Essayez-vous de lier statiquement un fichier .dylib dans votre programme? – zneak

+0

La bibliothèque a également une version .a disponible. (SDL2 dans mon cas.) – Arcanelab

+0

Lorsque vous passez une bibliothèque avec '-l' à Clang, l'éditeur de liens choisira toujours le .dylib sur le .a s'il y en a un. C'est un bug connu d'Apple. Vous pouvez peut-être contourner ce problème en ajoutant un répertoire factice avec une copie de la bibliothèque (ou un lien vers celle-ci) vers le chemin de la bibliothèque. – zneak

Répondre

1

Mettez vos bibliothèques statiques, par exemple, dir ./MyStaticLibs et il suffit d'utiliser -L./MyStaticLibs/ -l<StaticLibraryName>.

compilateur préfère la version dynamique sur la version statique de la bibliothèque

Si vous avez votre bibliothèque dynamique (random.dylib) et bibliothèque statique (random.a) puis dans le même répertoire compilateur préférera et le lien avec .dylib pas .a

1

Vous avez seulement quelques options: -L pour les répertoires et -l pour les noms de bibliothèques.

Vous pouvez le faire de la manière la plus simple en vous assurant que la bibliothèque statique que vous souhaitez lier est nommée différemment de la bibliothèque dynamique. Sinon, vous trouverez peut-être que l'éditeur de liens rassemble utilement toutes les références aux bibliothèques partagées par leur nom et leurs liens avec ceux. Ce n'est pas un problème spécifique à OSX, mais une caractéristique commune à de nombreux systèmes avec des bibliothèques partagées.

Une façon de vous assurer que vous avez la bibliothèque statique quand il se trouve normalement dans un répertoire avec la bibliothèque du même nom est de construire un lien symbolique dans un répertoire temporaire et utiliser qui avec -L.

Quelque chose comme ceci:

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

Merci pour vos réponses utiles, les gars! Vraiment apprécié. – Arcanelab