Comment de lien statique sur OS X
Je suis en train de lien à une bibliothèque statique sur OS X. j'ai utilisé le -static
drapeau de la gcc de commande, mais je reçois le message d'erreur suivant:
ld_classic: ne peut pas localiser le fichier pour: -lcrt0.o collect2: ld a retourné 1 code de sortie
J'ai regardé dans les pages man et il lit quelque chose comme:
Cette option ne fonctionne pas sur Mac OS X, à moins que toutes les bibliothèques (y compris les libgcc.a) ont également été compilé avec-statique. Puisque ni une version statique de libSystem.dylib ni crt0.o sont fournis, cette option n'est pas utile pour la plupart des gens.
Est-il une autre manière de créer un lien vers cette bibliothèque statique?
- Le stupide Apple docs vous recommandons de liaison dynamique, mais ils ne montrent pas tout
ld
de commande qui ne fait de cette.
Vous devez vous connecter pour publier un commentaire.
Afin de créer un lien vers une archive de la bibliothèque (parfois aussi appelée bibliothèque statique), il suffit de l'ajouter à la ligne de liaison:
L'éditeur de liens de recherche pour libtruc.dylib, puis libtruc.un, qui est tout ce dont vous avez besoin.
Si vous avez les deux versions de la bibliothèque, et souhaitez établir un lien avec une version d'archive, de préférence de la dynamique, il suffit de spécifier le chemin d'accès complet de l'archive sur la ligne de liaison:
crt0.o
par le biais deCsu
(abréviation de "C start up"), mais malheureusement ce n'crt0.o
est incapable de lien aveclibc
car il n'existe pas de version statique delibSystem.dylib
. Il y a plus de détails à propos de ce problème sur un Github billet pourCsu
.Malheureusement, il n'est pas pris en charge. Certaines personnes ont déclaré qu'il est possible de compiler à la main crt0 mais personne ne le confirme.
crt0.o
viaCsu
(abréviation de "C start up"), mais malheureusement ce n'crt0.o
est incapable de lien aveclibc
car il n'existe pas de version statique delibSystem.dylib
. Alors oui, il n'est pas pris en charge jusqu'à ce que Apple nous offre une version statique delibSystem.dylib
. Soit ça, ou ne pas utiliserlibc
. Il y a plus de détails sur ce Github billet pourCsu
.Un cas courant est de lien statique à l'encontre d'un tiers de l'utilisateur de la bibliothèque tout en reliant dynamiquement contre les cadres du système des et des bibliothèques, de sorte que vos utilisateurs n'ont pas besoin d'installer tiers libs avant l'utilisation de votre programme. Si la bibliothèque est liée de façon dynamique à l'encontre de cadres (comme c'est souvent le cas), il peut toujours livrés avec un statique .un, mais il ne suffit pas de les remplacer
-l<libname>
avec/path/to/libname.a
à cause de la .une volonté de ne pas avoir les dépendances en elle. Vous aurez également à lier dynamiquement à l'encontre de ceux des cadres que votre bibliothèque a été à l'aide.Par exemple, disons que vous voulez écrire un programme qui utilise l'open source libusb sans exiger de votre utilisateur de télécharger et d'installer libusb. Disons que vous avez un lié de façon dynamique binaire que vous avez construit avec ceci:
Lien statique sur OS X, la commande ressemble à ceci (notez le
-framework
arguments):De trouver ce système cadres et des bibliothèques, vous devez ajouter, regardez la troisième partie dylib à l'aide de otool:
qui montre:
Vous pouvez commencer par ajouter des cadres, suivie par les bibliothèques de l'une à un moment et vous verrez la liste de référence non définie erreurs de rétrécir. Remarque vous n'aurez probablement pas besoin d'ajouter de chaque bibliothèque, car certains peuvent être chargés comme des dépendances pour celles que vous avez ajoutées de manière explicite.
Si vous n'êtes pas sûr de l'endroit où le dylib existe, construire votre programme de l'original de manière dynamique (avec lusb-1.0), et d'exécuter otool sur elle:
qui donne:
Aussi, lire le contrat de licence de la bibliothèque que vous liez.
-Bstatic
semble être un no-op sur OS-X - Lion utiliségcc -v
pour le confirmer.J'ai été courir dans la même question. Voici un exemple de travailler:
ETAPE 1: créer des fichiers
myfunc1.c:
myfunc2.c:
et myfunc.c:
ETAPE 2: créer la lib
ETAPE 3: lien
Ne pas oublier de type "L."; point indique le chemin d'accès actuel.
Espère que ça aide.