Crear compilación estática de Mac OS XC

5 minutos de lectura

avatar de usuario
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

  • posible duplicado de Cómo hacer un enlace estático en OS X

    – osgx

    10 de marzo de 2011 a las 12:09

avatar de usuario
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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad