2012-08-09 21 views
6

Quiero compilar archivos binarios para un servidor Linux desde un sistema de compilación OS X 10.7 + Eclipse. Esto significa un compilador cruzado de GCC. Estoy comenzando desde el nativo 4.7.1 y estoy grabando para un host 4.7.1.Compilación cruzada a Linux desde OS X

La mayoría de las instrucciones en línea son específicas del desarrollo integrado. Quiero usar libstdC++ - v3 y glibc, que lo hacen un poco diferente.

Lo que sucede:

  1. instalar paquetes

    port install gcc47 
    export CC=gcc-mp-47 
    export LD=ld-mp-47 
    export CXX=g++-mp-47 
    export CPP=cpp-mp-47 
    
    port install gmake 
    ln /opt/local/bin/gmake /opt/local/bin/make 
    
    port install gsed 
    ln /opt/local/bin/gsed /opt/local/bin/sed 
    
    port install gawk 
    port install autoconf 
    port install msgfmt 
    
  2. Crea e instala binutils-2,22

  3. make all-gcc y make install-gcc

    Se utiliza la siguiente configuración:

    $ ../gcc/configure --enable-languages ​​= c, C++, objc, obj-C++ --with-gmp =/opt/local --with-mpfr =/opt/local - con-MPC =/opt/local --prefix =/usr// cruz/Linux locales --target = x86_64-pc-linux-gnu --disable-nls

  4. punto el entorno de construcción en la cruz -compiler

    export CC=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-gcc 
    export LD=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ld 
    export AR=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ar 
    export CXX=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-g++ 
    export CPP=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-cpp 
    
  5. Construir glibc-2.16 utilizando la configuración

    ../glibc/configure --host = x86_64-pc-linux-gnu --build = x86_64-apple-darwin11 --prefix =/usr/local/cross/linux/--with-binutils =/usr/local/cruz/Linux/bin/--con-headers =/usr/local/cruz/linux/include/libc_cv_forced_unwind = yes libc_cv_ctors_header = yes libc_cv_c_cleanup = yes

El fracaso:

glibc build falla antes de tiempo. Este mensaje aparece muchas veces:

In file included from ./sysdeps/unix/sysdep.h:20:0, 
       from ./sysdeps/unix/x86_64/sysdep.h:18, 
       from sysdeps/unix/sysv/linux/x86_64/sysdep.h:22, 
       from <stdin>:1: 
sysdeps/unix/sysv/linux/sys/syscall.h:24:24: fatal error: asm/unistd.h: No such file or directory 
compilation terminated. 

Esto puede ser normal, sin embargo.

Luego no produce stdio_lim.h. Con make -d, me sale esto:

  Successfully remade target file `/Users/dkrauss/Documents/work/glibc-build/csu/abi-tag.h'. 
      Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. 
      File `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h' does not exist. 
      Looking for an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. 
      Trying pattern rule with stem `lim'. 
      Trying implicit prerequisite `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'. 
      Found an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. 
      Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'. 
      Recently tried and failed to update file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'. 
make[2]: *** No rule to make target `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st', needed by `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. Stop. 

Esta es la primera cabecera se intenta construir en bits. Hay un archivo stdio_lim.h.in, que es el único archivo .in en su directorio. ¿Alguna regla debe estar conectando .st a .in?

+0

@DietrichEpp ¿Puedes aclarar? ¿Por qué debería cualquier compilador cruzado requerir algo del sistema operativo host? Hay algo muy sospechoso en principio sobre toda la cadena de herramientas. ¿Es un problema de puesta en escena? ¿Como intentar usar las bibliotecas de Linux en la plataforma nativa para pasar de la etapa 2 a la etapa 3? – Potatoswatter

+0

Lo siento, lo leí mal. –

+0

Parece que le ahorraría algunos días de su vida para instalar una máquina virtual. La compilación cruzada es un oso real. –

Respuesta

1

Para construir correctamente glibc, necesita los archivos de encabezado de un sistema Linux, probablemente los encabezados del kernel sean suficientes.

Esto se debe al hecho de que esos encabezados son necesarios en cualquier versión normal del software para ese sistema, y ​​lo mismo no es diferente cuando se realiza la compilación cruzada.

Ha pasado mucho tiempo desde que trabajé en la creación de compilaciones cruzadas, así que no puedo decirles cómo obtener la construcción de glibc para ver los encabezados, pero creo que se puede hacer de una manera directa .

+0

Gracias, podría volver a visitar esto pronto para verificar esta respuesta. – Potatoswatter

+0

¿Lo resolvió? – ash

+0

Lo siento, no lo hice. Por el momento no estoy usando Linux para nada. Ojalá lo haga en los próximos meses. – Potatoswatter

Cuestiones relacionadas