¿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
Daniel
¿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
osgx
No es compatible con gcc de Mac OS X:
http://discusiones.apple.com/message.jspa?messageID=11053384
Tal vez esa bandera “estática” no funcione en MacOS X. No todas las características de gcc están implementadas en MacOS X. Apple ni siquiera usará gcc en futuras versiones del sistema operativo.
No sé cómo vincular usando “-static”. No puedo pensar en ninguna razón para hacerlo en MacOSX. Si supiera por qué quería usar “-static”, podría estar más interesado en el problema. En este momento, simplemente no lo entiendo. Al pedir ayuda, básicamente estás pidiendo colaboradores en el proyecto, incluso si es solo por 10 minutos. Tienes que hacer que me interese.
Y http://developer.apple.com/library/mac/#qa/qa2001/qa1118.html
La vinculación estática de archivos binarios de usuario no es compatible con Mac OS X. Vincular los archivos binarios de usuario a la implementación interna de las bibliotecas e interfaces de Mac OS X limitaría nuestra capacidad para actualizar y mejorar Mac OS X. En su lugar, se admite la vinculación dinámica (vinculación contra crt1. o automáticamente en lugar de buscar crt0.o, por ejemplo).
Recomendamos enfáticamente 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 alguna 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.
una razón para usar -static
en la compilación estará en la creación de núcleos. Recientemente me encontré con este problema también. ¿Significa esto que uno no puede desarrollar un núcleo en una máquina OS X?
– Igbanam
14 de abril de 2013 a las 5:14
la vinculación del kernel (kernel OS) es una fase especial en cualquier caso. Kernel generalmente no tiene bibliotecas externas (el llamado modo independiente de lenguaje C, -nostdlib
y -nodefaultlibs
opción de gcc; no se usarán archivos crt*), y no está vinculado al formato de objeto típico (ELF/Mach-O; o al menos no usa el enlazador dinámico ld.so). Se utiliza un script de enlace especial y algo de posprocesamiento para convertir el objeto en una imagen de arranque binaria sin procesar. Entonces, creo que es posible compilar el kernel de Darwin en Mac OS X.
– osgx
14 de abril de 2013 a las 12:32
Soy nuevo en c, pero puedo ver al menos 3 razones para la estática: pedagógica (siguiendo el libro ac), portabilidad, estabilidad (si elimina accidentalmente un archivo vinculado, el ejecutable no funcionará).
– ling
19 de agosto de 2015 a las 18:47
Un binario que no tiene bibliotecas cargadas dinámicamente no se puede construir bajo OSX. Probé Apple llvm-gcc y macports gcc. Sin embargo, lo que ninguna respuesta mencionó hasta ahora es que esto no es necesario. Puede vincular la biblioteca c/c++ estáticamente (y vivir con alguna parte dinámica).
Archivo hola.cpp:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!";
}
Compilar como de costumbre:
g++ hello.cpp -o hello
Comprobar 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)
Lo hace -static-libgcc -static-libstdc++
trabajar para gcc (no g ++)?
– Hanxue
2 de diciembre de 2013 a las 15:14
-static-libstdc++
no es necesario para los programas en C, solo para los programas en C++. Entonces, sí, ambas opciones también funcionarán con gcc.
– osgx
13/04/2014 a las 17:00
Imagina que quieres convertir algunas funciones en una biblioteca.
Archivo: ejemplo.c
#include <stdio.h>
void aFunction( int a )
{
printf( "%d\n", a );
}
Archivo: ejemplo.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 ejemplo.c es una compilación estática de todo el programa.
¿Cómo puedo confirmar que es una compilación estática?
– Daniel
10 de marzo de 2011 a las 12:16
¡Pero el programa a.out estará enlazado dinámicamente!
– osgx
10 de marzo de 2011 a las 12:17
Entonces, en otras palabras, ¿puede compilar una biblioteca como estática pero no como un programa?
– Daniel
10 de marzo de 2011 a las 12:18
el preprocesador incluirá el código de la biblioteca en el ejecutable final. Cuando se requiere la función “aFunction”, el sistema operativo no tiene que vincularse con la biblioteca porque el código está dentro del ejecutable.
– momboco
10 de marzo de 2011 a las 12:21
@momboco, no un preprocesador, sino un enlazador (ld
)
– osgx
10 de marzo de 2011 a las 12:23
posible duplicado de Cómo hacer un enlace estático en OS X
– osgx
10 de marzo de 2011 a las 12:09