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
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.
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:
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
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
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
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).