Comment créer un lien statique sur OS X

j'essaie de créer un lien vers une bibliothèque statique sur OS X. j'ai utilisé le -static drapeau dans la commande gcc mais je reçois le message d'erreur suivant:

ld_classic: can't locate file for: -lcrt0.o
collect2: ld returned 1 exit status

j'ai regardé dans les pages de manuel et il lit quelque chose comme:

cette option ne fonctionnera pas sur Mac OS X à moins que toutes les bibliothèques (y compris libgcc.a) ont également été compilés avec-static. Depuis ni une version statique de libSystem.dylib ni crt0.o sont fournis, cette option n'est pas utile pour la plupart des gens.

y a-t-il un autre moyen de se connecter à cette bibliothèque statique?

42
demandé sur G.Rassovsky 2009-05-10 10:22:10

5 réponses

pour créer un lien vers une bibliothèque d'archives (parfois aussi appelée bibliothèque statique), il suffit de l'ajouter à la ligne de lien:

gcc main.o ... -lfoo ...

le linker va chercher libfoo.dylib, puis libtruc.un, qui est tout ce dont vous avez besoin.

Si vous avez versions de la bibliothèque, et que vous souhaitez créer un lien avec une version d'archive de préférence à la version dynamique, il vous suffit de spécifier le chemin complet de l'archive sur la ligne de lien:

gcc main.o ... /path/to/libfoo.a ...
54
répondu Employed Russian 2014-06-13 16:06:17

regrettablement,il n'est pas supporté. Certaines personnes ont indiqué qu'il est possible de compiler crt0 manuellement mais personne ne le confirme.

12
répondu alecco 2009-12-04 16:33:11

-Bstatic semble être un no-op sur OS-X - Lion utilisé gcc -v pour confirmer.

7
répondu atrens 2012-10-03 16:00:03

un cas courant estlien statique contre une troisième bibliothèque utilisateur tout en liant dynamiquement contre les cadres du système et les bibliothèques, de sorte que vos utilisateurs n'ont pas besoin d'installer des libs tiers avant d'utiliser votre programme. Si la Bibliothèque est dynamiquement liée à des cadres (comme c'est souvent le cas), elle peut quand même être expédiée avec un statique .un, mais il ne suffit pas de remplacer -l<libname>/path/to/libname.a parce que le .une volonté de ne pas avoir les dépendances. Vous aurez également à liez dynamiquement ces cadres que votre bibliothèque utilisait.

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. Supposons que vous ayez un binaire lié dynamiquement que vous avez construit avec ceci:

clang -lusb-1.0 main.c -o myprogram

lien statique sur OS X, la commande ressemble à ceci (notez le -framework arguments):

clang -framework CoreFoundation -framework IOKit main.c /path/to/libusb-1.0.a -o myprogram

pour trouver les cadres de système et les bibliothèques que vous devez ajouter, regardez le tiers dylib en utilisant otool:

otool -L /usr/local/opt/libusb/lib/libusb-1.0.0.dylib

qui indique:

/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)  

vous pouvez commencer par ajouter les cadres, suivis par les bibliothèques une à la fois et vous verrez la liste des erreurs de référence non définies rétrécir. Notez que vous n'aurez probablement pas besoin d'ajouter toutes les bibliothèques, car certaines peuvent être chargées en tant que dépendances pour celles que vous avez explicitement ajoutées.

si vous n'êtes pas sûr où le dylib existe, construisez votre programme de la manière dynamique originale (avec -lusb-1.0), et d'exécuter otool sur:

clang -lusb-1.0 main.c -o myprogram
otool -L myprogram

ce qui donne:

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)

aussi, lisez la licence de la bibliothèque à laquelle vous faites référence.

7
répondu Michael Chinen 2017-01-06 21:44:45

j'ai été courir dans la même question. Voici un exemple de travailler:

ETAPE 1: créer des fichiers

myfunc1.c:

#include <stdio.h>

void myfunc1() {
    printf( "This is my func1!\n" );
}

myfunc2.c:

#include <stdio.h>

void myfunc2() {
    printf( "This is my func2!\n" );
}

et myfunc.c:

#include <stdio.h>

void myfunc1( void );
void myfunc2( void );

int main() {
    myfunc1();
    myfunc2();
    return 0;
}

ETAPE 2: créer la lib

gcc -c myfunc1.c myfunc2.c

ar -r libmyfuncs.a myfunc1.o myfunc2.o

ETAPE 3: lien

gcc -o myfunc -L. myfunc.c -lmyfuncs 

n'oubliez pas de taper "-L."; Le point indique le chemin courant.

j'Espère que vous aide.

0
répondu Zhi Q. 2017-06-11 16:49:10