web-dev-qa-db-fra.com

Création d'une version statique de Mac OS X C

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
33
Daniel

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

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

Peut-être que ce drapeau "-statique" ne fonctionnera pas 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 de la OS.

Je ne sais pas comment lier en utilisant "-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 sur le projet - même si ce n'est que pour 10 minutes. Vous devez m'intéresser.

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

La liaison statique des fichiers binaires utilisateur n'est pas prise en charge sur Mac OS X. Lier les fichiers binaires utilisateur à la mise en œuvre interne des bibliothèques et interfaces Mac OS X limiterait notre capacité à mettre à jour et à améliorer Mac OS X. Au lieu de cela, la liaison dynamique est prise en charge (liaison contre crt1. o automatiquement au lieu de rechercher crt0.o, par exemple).

Nous vous recommandons fortement de considérer 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 binaire statique. Mais vous pouvez toujours compiler 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 dynamiques, donc le programme sera un exécutable dynamique.

28
osgx

Un binaire qui n'a pas de bibliothèques chargées dynamiques ne peut pas être construit sous OSX. J'ai essayé les deux Apple llvm-gcc et macports gcc. Cependant, aucune réponse mentionnée jusqu'à présent n'est que ce n'est pas nécessaire. Vous pouvez lier la bibliothèque c/c ++ statiquement (et vivre avec une partie dynamique) ).

Fichier hello.cpp:

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

Compilez 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, juste Apple ne prend pas en charge la liaison statique:

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)
16
gbasler

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

Fichier: example.c

#include <stdio.h>

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

Fichier: example.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.

7
momboco