Création d’une version statique de Mac OS XC

Comment puis-je créer une version statique d’un fichier .c sur Mac OS X? Quand j’essaye:

gcc -o test Main.c -static 

Je reçois:

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

Il n’est pas pris en charge dans le gcc de Mac OS X:

http://discussions.apple.com/message.jspa?messageID=11053384

Peut-être que le drapeau “-static” ne fonctionnera pas à fond sur MacOS X. Toutes les fonctionnalités de gcc ne sont pas implémentées sur MacOS X. Apple n’utilisera même pas gcc dans les futures versions du système d’exploitation.

Je ne sais pas comment lier avec “-static”. Je ne vois aucune raison de le faire sur MacOSX. Si je savais pourquoi vous vouliez utiliser “-static”, je serais peut-être plus intéressé par le problème. Pour l’instant, je ne comprends pas. En demandant de l’aide, vous demandez essentiellement des collaborateurs pour le projet, même s’il ne dure que 10 minutes. Vous devez m’intéresser.

Et http://developer.apple.com/library/mac/#qa/qa2001/qa1118.html

La liaison statique des fichiers binarys des utilisateurs n’est pas prise en charge sous Mac OS X. Lier les fichiers binarys des utilisateurs à l’implémentation interne des bibliothèques et des interfaces Mac OS X limiterait notre capacité à mettre à jour et à améliorer Mac OS X. La liaison dynamic est également prise en charge (liaison avec crt1. o automatiquement au lieu de chercher crt0.o, par exemple).

Nous vous recommandons vivement d’envisager très attentivement les limites de la liaison statique et de prendre en compte votre client et ses besoins, ainsi que le support à long terme que vous devrez fournir.

Mise à jour: l’interdit est un binary statique. Mais vous pouvez toujours comstackr une bibliothèque statique et l’utiliser avec un autre programme. Le programme sera lié statiquement à votre bibliothèque, mais d’autres bibliothèques comme libc seront dynamics, donc le programme sera un exécutable dynamic.

Un binary qui n’a pas de bibliothèque chargée dynamic ne peut pas être construit sous OSX. J’ai essayé à la fois apple llvm-gcc et macports gcc. Cependant, aucune réponse mentionnée jusqu’à présent, c’est que cela n’est pas nécessaire. Vous pouvez lier la bibliothèque c / c ++ de manière statique (et vivre avec une partie dynamic).

Fichier hello.cpp:

 #include  using namespace std; int main() { cout << "Hello World!"; } 

Comstackr comme d'habitude:

 g++ hello.cpp -o hello 

Vérifier la liaison:

 otool -L hello hello: /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 

Nous ne pouvons pas nous débarrasser de la dépendance libSystem.B.dylib mais avec macports gcc, nous pouvons le faire:

 g++-mp-4.6 -static-libgcc -static-libstdc++ hello.cpp -o hello otool -L hello hello: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 

Apparemment, Apple ne prend pas en charge les liens statiques:

 llvm-g++ -static-libgcc -static-libstdc++ hello.cpp -o hello otool -L hello hello: /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 

Imaginez que vous souhaitiez convertir certaines fonctions en une bibliothèque.

Fichier: exemple.c

 #include  void aFunction( int a ) { printf( "%d\n", a ); } 

Fichier: exemple.h

 void aFunction( int a ); 

Fichier: main.c

 #include "example.h" int main( ) { aFunction( 3 ); return 0; } 

Pour créer la bibliothèque:

 gcc -c example.c ar -r libmylibrary.a example.o 

Pour lier la bibliothèque:

 gcc main.c -lmylibrary -L. -I. 

Et puis le fichier example.c est une construction statique de l’ensemble du programme.