2010-11-08 24 views
7

Tengo algunos conocimientos básicos sobre la compilación de C pero necesito obtener un par de preguntas genéricas de compilación cruzada. En mi caso, estoy tratando de compilar de forma cruzada un programa en mi caja de Fedora Linux que se ejecutará en una computadora de una sola placa ARM.Requerimientos de compilación cruzada para C

  1. Mi primera pregunta es sobre los encabezados. He descargado el paquete de herramientas de herramientas de Linux y contiene archivos de encabezados como stdio.h en un directorio de inclusión. ¿Se supone que debo usar este directorio de inclusión "objetivo" en lugar de incluir directorios de mi sistema cuando estoy compilando de forma cruzada? ¿O está bien apuntar a los directorios de inclusión de mi sistema como/usr/include? (Estos archivos de encabezado parecen ser diferentes cuando los diferencio).

  2. ¿Qué sucede si no existe un archivo de encabezado? En mi caso, también estoy planeando utilizar la biblioteca cURL en el tablero ARM. ¿Puedo simplemente señalar el directorio de inclusión presente en el paquete fuente curl que descargué sin preocuparme por la arquitectura objetivo? En caso afirmativo, ¿significa esto que mi primera pregunta es irrelevante?

  3. Digamos que quiero vincular estáticamente a una biblioteca. ¿Es necesario compilar esta biblioteca estática para la plataforma de ARM objetivo antes de que esto suceda? ¿O puedo usar las bibliotecas estáticas instaladas en mi sistema directamente (con la esperanza de que el proceso de compilación cruzada se encargue del negocio)?

  4. Si decido vincular dinámicamente a una biblioteca, el único requisito sería que el sistema objetivo tenga esta biblioteca compilada para ARM e instalada en uno de los directorios LD_LIBRARY_PATH en la placa ARM, ¿estoy en lo correcto?

Gracias por la ayuda.

Respuesta

10
  1. Utilice siempre los encabezados de destino. Pueden diferir de sus encabezados de host. El compilador ya debería tenerlos como parte de su ruta de inclusión predeterminada para el problema estándar, como libc.
  2. Necesitará construir cURL utilizando el compilador cruzado en un falso directorio de sistema "objetivo", y compilar su aplicación con cURL en este directorio de destino. Como también necesita una biblioteca cURL, DEBE usar el compilador cruzado. Para las compilaciones que no son compatibles con la compilación cruzada (como la compilación de programas y la ejecución como parte de la compilación), deberá modificar el proceso de compilación. A veces, fakeroot puede ser útil para sistemas de construcción sucios.
  3. No puede utilizar arbitrariamente una biblioteca estática para una arquitectura diferente de su sistema. Deben ser construidos por el compilador cruzado.
  4. Incorrecto. La biblioteca generalmente debe estar presente.
+1

Para ampliar el punto 1: el medio ambiente compilador cruzado ya debe estar configurado para que un #include 'referencias al descubierto la versión' brazo de la cabecera (es decir, se debe buscar en otro lugar que '/ usr./include'). – caf

+0

¿Puede explicar el segundo tema? Estoy particularmente confundido acerca del "Como también necesitas una biblioteca cURL, DEBES usar el compilador cruzado". frase. ¿Ya cubriste este paso en tu primera oración? – Burak

+0

@Burak: es muy poco probable que el compilador de cruce ARM se envíe con cURL. Si no es así, debe crear un mini "sistema de archivos raíz" para permitir que las compilaciones y los enlaces funcionen.Existe una razón por la que existen frameworks como buildroot y OpenEmbedded: la compilación cruzada puede ser un problema –

3

Cualquier biblioteca que desee utilizar, incluida la libc, se debe crear para la plataforma de destino antes de poder enlazarla. Utilice los encabezados de destino en lugar de los encabezados de host para compilar, de modo que esté seguro de utilizar la API correcta.

Cuestiones relacionadas