En el post anterior, hemos examinado la forma del núcleo, libc, gcc, archivo ELF, linux cargador dinámico (ld.so) trabaja en conjunto para proporcionar un entorno alojado por lo que nuestra aplicación pueda ser compilada y felizmente se ejecuta en este entorno alojado.
software GNU ha sido portado a muchos sistemas operativos como Unix, incluyendo Linux. Sí GCC podría funcionar bajo muchas plataformas. Con la ayuda de GCC, podemos escribir c / c + + programa y utilizar GCC para cruzar compilarlo para multiplataformas. / Programas portables C C + + no se logran fácilmente, al igual que su homólogo de java / python / .NET. GCC cadena de herramientas tiene un sistema de construcción denominado «autotools», que se refieren específicamente a los temas de la programación de aplicaciones portátiles para diferentes sistemas Unix. Sí GCC se construye utilizando este sistema de construcción.
Escribir portátil c / c + + / código de proyecto se hace bastante esfuerzo, y su complejidad se basa en cómo «portátil» que será el programa. Los materiales más relevantes para este tema es este libro «, escriben los códigos portátiles»:
http://www.nostarch.com/wpc.htm
Necesitamos una cadena de herramientas GCC compilación cruzada para nuestro medio ambiente Cubietruck ARM. Este es un escenario típico para el desarrollo de aplicaciones portátiles, tanto para GCC y de la aplicación que vamos a instalar en Cubietruck, como núcleo, init, rootfs, etc Es realmente necesario para entender cómo GCC soporte multiplataforma desarrollo a través de autotools antes de compilación cruzada propio GCC. /> 1. El sabor de desarrollo de código portátil en el Sistema de construcción GCC
GCC es intrínsecamente un «compilador cruzado», incluso cuando usted lo está utilizando como un compilador nativo. Voy a demostrar los conceptos de desarrollo de plataforma cruzada utilizando nuestro sencillo «hello.c» de nuevo en el entorno de compilación de GCC. Supongamos que yo volvería a hacer portátil «hello.c» a través de diferentes plataformas de tipo Unix, esto es lo que voy a hacer en el entorno de compilación gcc:
a. Primero lo primero, hello.c sólo usan «printf» se define en «stdio.h». Esta es la función definida en C estándar. Se debe trabajar a través de la plataforma compatible con POSIX; b. Para construir mi hello.c para diferentes plataformas, necesito cadenas de herramientas GCC correspondientes, cada uno dirigido a la generación de códigos para diferentes plataformas; c. Voy a organizar mi proyecto usando GCC Autotools (autoconf, automake), por lo que los archivos de compilación cruzada se generará automáticamente para mí a través de script «configure». . Esto me ahorrará un montón de problemas
Autotools es un gran tema, refiérase por favor debajo enlace para obtener más información: http://en.wikipedia.org/wiki/GNU_build_system http://www.amazon.com/Autotools-Practioners-Autoconf-Automake-Libtool/dp/1593272065 http://www.apress.com/9781590591093
$ aclocal $ automake-a configure.ac: 10: instalación ‘/ compile.’ configure.ac: 7: instalar ‘. / install-sh’ configure.ac: 7: instalar ‘. / perdido» Makefile.am: instalar ‘/ INSTALAR.’ Makefile.am: error: archivo requerido ‘/ NEWS.’ no encontrado Makefile.am: error: archivo requerido ‘/ README.’ no encontrado Makefile.am: error: archivo requerido ‘. / autores no encontraron Makefile.am: error: archivo requerido ‘. / ChangeLog’ no encontrado Makefile.am: instalar ‘/ COPIA.’ usando el archivo de licencia v3 Pública General GNU Makefile.am: Considere agregar el archivo COPYING para el sistema de control de versiones Makefile.am: su código, para evitar preguntas sobre qué licencia el proyecto utiliza Makefile.am: instalar ‘/ depcomp.’ AUTORES $ touch NOTICIAS README ChangeLog $ automake $ autoconf $ ls aclocal.m4 autom4te.cache compilación configure.ac depcomp INSTALAR Makefile.am falta README AUTORES ChangeLog configure COPIA hola.c install-sh Makefile.in NOTICIAS
ahora el «configure» y «Makefile.in» han sido generados por autotools. Podemos utilizar «configure» para generar scripts de compilación multiplataforma. En mi máquina de trabajo, tengo dos herramientas principales GCC. Uno de ellos es el nativo proporcionado por Debian-7, la versión es 4.7, y el otro es una cadena de herramientas del brazo Linaro con la versión 4.8.1. Tengo que poner a todos en mi variable de entorno «Path» por lo que «configurar» puede encontrarlos />
Cuando especificamos «- host = x86_64-linux-gnu» a la escritura «configure», que tratará de buscar en el PATH para controlador gcc llamado «$ {HOST}-gcc». En este caso, se está buscando «x86_64-linux-gnu-gcc». «Configurar» verificar este gcc funciona la cadena de herramientas y luego generar corresponde crear el archivo de la base de esta cadena de herramientas. Cuando ejecutamos «make», la cadena de herramientas a la derecha se llama para generar binarios para nuestro requerida «host», como se puede ver en la salida
A continuación vamos a generar ejecutables ARM como se muestra a continuación:.
$ make clean test-z» hola «| | rm-f hola . rm-f * o $ . / configure – acogida = arm-linux-gnueabihf comprobación de compatibilidad BSD-a instalar … / Usr / bin / install-c comprobar si entorno de compilación es sana .. . sí comprobación de brazo-linux-gnueabihf tira … arm-linux-gnueabihf-strip la comprobación de un hilo- seguro mkdir-p … / Bin / mkdir-p comprobación de gawk … gawk comprobar si hacen juegos $ (MAKE) … sí comprobar si make admite variables anidadas … sí comprobación de brazo-linux-gcc-gnueabihf … arm-linux-gcc-gnueabihf comprobar si el compilador de C funciona … sí comprobación de nombre de archivo de salida predeterminado compilador de C … a.out comprobación de sufijo de ejecutables … comprobando si estamos realizando compilación cruzada … sí comprobación de sufijo de los archivos objeto … o comprobar si estamos usando el compilador GNU C … sí comprobar si el brazo-linux-gcc-gnueabihf acepta-g … Sí comprobación de brazo-linux-gnueabihf- opción de gcc para aceptar ISO C89 … No es necesaria comprobar si el brazo-linux-gnueabihf -gcc entiende-c y-o juntos … Sí comprobación de estilo de incluir utilizada por marca … GNU comprobar estilo dependencia del brazo-linux-gcc-gnueabihf … gcc3 comprobar cómo ejecutar el preprocesador de C … arm-linux-gnueabihf-gcc-E comprobación de grep que se encarga de las largas colas y-e … / Bin / grep comprobación de egrep … / Bin / grep-E la comprobación de los archivos de cabecera de C de ANSI … sí comprobación de sys / types.h … sí comprobación de sys / stat.h … sí comprobación de stdlib.h … sí comprobación de string.h … sí comprobación de memory.h … sí comprobación de strings.h … sí comprobación de inttypes.h … sí comprobación de stdint.h … sí comprobación de unistd.h … sí comprobar la usabilidad stdio.h … sí comprobar la presencia stdio.h … sí comprobación de stdio.h … sí comprobación que genera archivos son más recientes que configure … done configure:. crear / config.status config.status: la creación de Makefile config.status: comandos ejecutar depfiles $ make brazo- linux-gnueabihf-gcc -DPACKAGE_NAME = «hola «-DPACKAGE_TARNAME = «hola «-DPACKAGE_VERSION = «1.0 «-DPACKAGE_STRING = «Hola 1.0 «-DPACKAGE_BUGREPORT = «luke @ luke.org «-DPACKAGE_URL = » «-DPACKAGE = » hola «-DVERSION = » 1.0 «-DSTDC_HEADERS = 1-DHAVE_SYS_TYPES_H = 1-DHAVE_SYS_STAT_H = 1-DHAVE_STDLIB_H = 1-DHAVE_STRING_H = 1-DHAVE_MEMORY_H = 1-DHAVE_STRINGS_H = 1-DHAVE_INTTYPES_H = 1-DHAVE_STDINT_H = 1-DHAVE_UNISTD_H = 1-DHAVE_STDIO_H = 1-I. -G-O2-MT hello.o-MD-MP-MF .deps / hello.Tpo -c-o hello.o hola.c mv-f .deps / hello.Tpo .deps / hello.Po arm-linux-gnueabihf-gcc-g-O2-o hola hello.o $ file hola hola: ELF 32-bits LSB ejecutable, ARM , versión 1 (SYSV), vinculada dinámicamente (usa librerias compartidas), para GNU / Linux 3.1.1, BUILDID [SHA1] = 0x759ac38b3bed8ea02fb13f347e3c9764d19538f7, no despojado
Esta vez «configurar» se comprobar «arm-linux-gnueabihf-*» cadena de herramientas GCC, y generar correspondiente crea el archivo. Después de «hacer», podemos ver un «ARM» ejecutable «hola» en realidad está construido. Dado que no tenemos un «ARM» entorno alojado, sin embargo, no podemos ejecutar esta versión «ARM» «hola» en estos momentos.
Es bastante sencillo de cruzar compilar nuestra ingenua » cruz-plataforma portátil «proyecto hola en entorno de compilación GCC. En el entorno Autotools, el flujo de trabajo básico es:
[config.ac] —> Especifica requisito característica de alto nivel para entorno de compilación / host para su programa. El script «configure» generada le ayudará a verificar estos requisitos se cumple antes de compilar. Si no es así, sino que terminará con error; [Makefile.am] —> especifica la arquitectura de su proyecto
; [
GCC es mucho, mucho más compleja que la nuestra «hello.c». Antes de que podamos construir con éxito cruzado GCC, tenemos que tener un conocimiento básico del compilador cruzado.
2. Compilación de un compilador: Pollo y Huevo Historia />
Por suerte, GCC aún no es tan inteligente. Ahora perfectamente puede replicarse a sí mismo, pero no es una versión de la energía más sabio o más. GCC es propio escrito en código C / C + + código fuente.