sierra - Creación de compilación estática de Mac OS XC
version de mac (3)
Imagine que desea convertir algunas funciones en una biblioteca.
Archivo: example.c
#include <stdio.h>
void aFunction( int a )
{
printf( "%d/n", a );
}
Archivo: example.h
void aFunction( int a );
Archivo: main.c
#include "example.h"
int main( )
{
aFunction( 3 );
return 0;
}
Para crear la biblioteca:
gcc -c example.c
ar -r libmylibrary.a example.o
Para vincular la biblioteca:
gcc main.c -lmylibrary -L. -I.
Y luego el archivo example.c es una compilación estática de todo el programa.
¿Cómo puedo crear una compilación estática de un archivo .c en Mac OS X? Cuando intento:
gcc -o test Main.c -static
Yo obtengo:
ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status
No es compatible con gcc de Mac OS X:
http://discussions.apple.com/message.jspa?messageID=11053384
Quizás esa bandera "estática" no funcionará en MacOS X. No todas las características de gcc están implementadas en MacOS X. Apple ni siquiera va a usar gcc en futuras versiones del sistema operativo.
No sé cómo vincular usando "-estático". No puedo pensar en ninguna razón para hacerlo en MacOSX. Si supiera por qué quería usar "-estático", podría estar más interesado en el problema. En este momento, simplemente no lo entiendo. Al pedir ayuda, esencialmente está pidiendo colaboradores en el proyecto, incluso si solo es por 10 minutos. Necesitas que me interese
Y http://developer.apple.com/library/mac/#qa/qa2001/qa1118.html
La conexión estática de binarios de usuario no es compatible con Mac OS X. La vinculación de binarios de usuarios a la implementación interna de bibliotecas e interfaces de Mac OS X limitaría nuestra capacidad de actualizar y mejorar Mac OS X. En cambio, se admite vinculación dinámica (vinculación con crt1. o automáticamente en lugar de buscar crt0.o, por ejemplo).
Recomendamos encarecidamente que considere las limitaciones de la vinculación estática con mucho cuidado y considere a su cliente y sus necesidades, además del soporte a largo plazo que deberá brindar.
Actualización: lo prohibido es un binario estático. Pero aún puede compilar una biblioteca estática y usarla con otro programa. El programa se vinculará estáticamente con su biblioteca, pero otras bibliotecas como libc serán dinámicas, por lo que el programa será un ejecutable dinámico.
Un archivo binario que no tenga bibliotecas cargadas dinámicamente no se puede compilar en OSX. Probé tanto con Apple llvm-gcc como con macports gcc. Sin embargo, lo que ninguna respuesta mencionada hasta ahora es que esto no es necesario. Puede vincular la biblioteca c / c ++ estáticamente (y vivir con alguna parte dinámica).
Archivo hello.cpp:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!";
}
Compilar como de costumbre:
g++ hello.cpp -o hello
Compruebe el enlace:
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)
No podemos deshacernos de la dependencia libSystem.B.dylib pero con macports gcc podemos hacer esto:
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)
Aparentemente solo Apple no admite enlaces estáticos:
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)