web-dev-qa-db-fra.com

ld: bibliothèque introuvable pour -lcrt0.o sous OSX 10.6 avec l'indicateur gcc/clang -static

Quand j'essaye de construire le programme suivant:

#include <stdio.h>

int main(void)
{
  printf("hello world\n");
  return 0;
}

Sous OS X 10.6.4, avec les drapeaux suivants:

gcc -static -o blah blah.c

Il retourne ceci:

ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status

Quelqu'un d'autre l'a-t-il rencontré ou est-ce quelque chose avec lequel personne d'autre n'a encore été touché? Des correctifs?

Merci

45
browneye

Cela ne fonctionnera pas. De la page man pour gcc:

Cette option ne fonctionnera sous Mac OS X que si toutes les bibliothèques (y compris libgcc.a) ont également été compilées avec -static. Etant donné qu'aucune version statique de libSystem.dylib ni crt0.o n'est fournie, cette option n'est pas utile pour la plupart des gens.

54
Nate

Selon Nate, une application totalement statique n’est apparemment pas possible - voir aussi man ld :

-static Produit un fichier mach-o qui n'utilise pas le dyld. Seulement utilisé pour construire le noyau.

La liaison avec des bibliothèques statiques pose le problème suivant: si une version statique et une version dynamique d’une bibliothèque se trouvent dans le même répertoire, la version dynamique sera choisie de préférence. Trois façons d'éviter cela sont:

  1. N'essayez pas de les trouver via les options -L et -l; à la place, spécifiez les chemins d'accès complets aux bibliothèques que vous souhaitez utiliser sur la ligne de commande du compilateur ou de l'éditeur de liens.

    $ g ++ -Wall -Werror -o hi /usr/local/lib/libboost_unit_test_framework.a hi.cpp

  2. Créez un répertoire séparé, contenant des liens symboliques vers les bibliothèques statiques, utilisez l'option -L pour que ce répertoire soit d'abord recherché, puis utilisez l'option -l pour spécifier les bibliothèques que vous souhaitez utiliser.

    $ g ++ -Wall -Werror -L ./staticBoostLib -l boost_unit_test_framework -o hi hi.cpp

  3. Au lieu de créer un lien du même nom dans un répertoire différent, créez un lien d'un nom différent dans le même répertoire et spécifiez ce nom dans un argument -l.

    $ g ++ -Wall -Werror -l boost_unit_test_framework_static -o hi hi.cpp

0
sdenham

Vous pouvez également essayer l’éditeur de liens LLVM LLD - j’ai fait une version prédéfinie de mes deux principaux systèmes d’exploitation - https://github.com/VerKnowSys/Sofin-llds

Celui-ci me permet de lier correctement, par exemple: "Qemu" - ce qui est impossible avec ld préinstallé par Apple.

Enfin, construisez vous-même GCC avec libstdc ++ (non).

0
dmilith