2012-08-03 32 views
7

Necesito compilar de forma cruzada alguna biblioteca C/C++. La biblioteca depende de varias bibliotecas C/C++. Algunas de las bibliotecas a su vez dependen de otras bibliotecas. Todas las bibliotecas vienen con script de configuración. Sé cómo compilar e instalar bibliotecas en el sistema host - instalar dependencias antes de la lib que necesito. Obviamente, esto no funcionará cuando se compile de forma cruzada. Cualquier consejo es apreciado. Gracias.Cómo compilar en forma cruzada C++ - ¿biblioteca con dependencias?

Respuesta

8

En general, para realizar una compilación cruzada de un paquete autotoleado, puede pasar un par de argumentos adicionales al ./configure: --host y --build. --host es el nombre del sistema en el que se ejecutarán los programas creados, y --build es el nombre del sistema que hace la compilación.

Cuando digo "nombre del sistema", me refiero a una tupla del formulario ARCH-VENDOR-OS-LIBC. (Por ejemplo, i686-pc-linux-gnu es la tupla que describe el sistema que estoy usando actualmente). A veces se eliminan partes de la tupla, como en el caso de la cadena de herramientas mingw32 (en mi sistema, las herramientas cruzadas mingw32 se instalan con la tupla i586-mingw32msvc y/o amd64-mingw32msvc).

(Hay otro argumento para configurar, --target, que es para los compiladores cruzados compilar y especifica el sistema que el compilador está construyendo se dirigirá a la hora de generar código.)

Cada cadena de herramientas tiene su propio subdirectorio bajo /usr como /usr/i586-mingw32msvc. Vas a querer instalar nuevos paquetes aquí para que los encuentren. Use el argumento --prefix al configure.

Así compilar en forma cruzada de mi sistema GNU/Linux a un sistema MinGW32, yo correría configure así:

./configure --host=i586-mingw32msvc --build=i686-pc-linux-gnu --prefix=/usr/i586-mingw32msvc 

así que empieza con las hojas de la gráfica de dependencia y su forma de trabajo. También puede pasar --enable-static --disable-shared a configure: eso detendrá la creación de bibliotecas dinámicas para paquetes libtooled. Puede que tenga que instalar algunos paquetes de forma nativa y compilarlos de forma cruzada, si un paquete necesita ejecutar un programa como parte de la compilación.

Algunas veces las pruebas de configure fallarán: donde se intenta compilar y ejecutar un programa, por ejemplo. A menudo, estas pruebas establecen una variable de caché que también puede pasar en la línea de comando al configure. Del mismo modo, puede anular cosas como las rutas del programa y los indicadores de compilación/enlace de la biblioteca. Verifique el paquete ./configure --help.

0

Lo que necesita hacer es crear bibliotecas estáticas para todas las dependencias y vincularlas estáticamente a su ejecutable. Tendrá que usar el compilador cruzado para producir esas bibliotecas. Puede encontrar algunos ejemplos buenos buscando "mingw link link cross compile"

3

No hay absolutamente ningún problema para compilar contra bibliotecas compiladas cruzadas siempre que se asegure de que compila contra encabezados y bibliotecas para el sistema de destino en lugar del anfitrión de desarrollo.

Incluso si construyes todas las dependencias obvias como bibliotecas estáticas, probablemente aún te encuentres enlazando con bibliotecas de tiempo de ejecución de lenguaje C y C++ compartidas. También debe asegurarse de que los archivos de encabezado utilizados para la compilación cruzada sean los de su sistema de destino en lugar del host de desarrollo.
No hacer esto probablemente funcione la mayor parte del tiempo. El resto del tiempo obtendrá bloqueos sutiles difíciles de depurar.

Cómo lograr esto depende de cómo se cruzan la cadena de herramientas y el entorno de destino. Como tampoco has mencionado, supongo que es GCC y algo de Linux como host y destino de desarrollo, aunque los principios se aplican por igual al uso de otros hosts de desarrollo.

Compilación cruzada Las distribuciones GCC y bin-utils generalmente se compilan para que las rutas predeterminadas de búsqueda de biblioteca y encabezado apunten a una copia del sistema de archivo raíz del sistema de destino. Aquí es donde el vinculador buscará bibliotecas compartidas para vincular, y aquí es donde instala sus bibliotecas compartidas dependientes cuando se crean.

Puede anular la raíz predeterminada del sistema de GCC pasando la opción --sysroot <mySysRoot> a GCC en la línea de comandos.

Cuestiones relacionadas