c linux gcc arm cross-compiling

¿Cómo trabajar con bibliotecas externas al compilar de forma cruzada?



linux gcc (5)

Claramente, necesitará un ncurses compilados para el ARM que está apuntando, el que está en el host no le servirá de nada [a menos que su host tenga un procesador ARM, pero dijo que x86, así que claramente no es el caso].

PUEDE haber algunas bibliotecas pre-compiladas disponibles, pero sospecho que es más difícil encontrar una (que funcione y se ajuste a sus condiciones específicas) que construir la biblioteca usted mismo a partir de las fuentes, no debería ser tan difícil, y espero que ncurses no lo haga. Tómate tantos minutos para construir.

Estoy escribiendo algún código para raspberry pi ARM target en x86 ubuntu machine. Estoy usando la cadena de herramientas gcc-linaro-armhf. Soy capaz de compilar y ejecutar algunos programas independientes en pi. Ahora, quiero vincular mi código con una biblioteca externa como ncurses. Cómo puedo conseguir esto.

¿Debería vincular mi programa con la biblioteca ncurses existente en la máquina host y luego ejecutarlo en ARM? (No creo que esto funcione) ¿Necesito obtener una versión original o prefabricada de lib para arm, ponerla en mi ruta de lib y luego compilar?

¿Cuál es la mejor práctica en este tipo de situación?

También quiero saber cómo funciona para el c stdlib. En mi programa utilicé las funciones de stdio y funcionó después de la compilación cruzada sin hacer nada especial. Acabo de proporcionar la ruta para mi gcc brazo en makefile. Por lo tanto, quiero saber, ¿cómo se obtuvieron los encabezados y librerías estándar de la versión correcta?


Con respecto a sus preguntas generales:

Por qué funciona la biblioteca C:

La biblioteca de C es parte de su cadena de herramientas cruzada. Es por eso que se encuentran los encabezados y el programa se vincula y ejecuta correctamente. Esto también es cierto para algunas otras bibliotecas de sistemas muy básicas como libm y libstdc ++ (no en todos los casos, depende de la configuración de la cadena de herramientas).

En general, cuando se trata de desarrollo cruzado, necesita alguna forma de compilar las bibliotecas deseadas. Usar binarios en este caso es muy raro. Es decir, especialmente con el hardware ARM, porque hay muchas configuraciones diferentes y, a menudo, todo se simplifica de muchas maneras diferentes. Es por eso que los binarios no son muy compatibles entre distintos dispositivos y configuraciones de Linux.

Si está ejecutando Ubuntu en la Raspberry Pi, existe la posibilidad de que encuentre una biblioteca de ncurses adecuada en Internet o incluso en algún repositorio de Ubuntu apt. Sin embargo, la forma típica será compilar de forma cruzada la biblioteca con la cadena de herramientas específica que tienes.

En los casos en que es necesario compilar de forma cruzada una gran cantidad de bibliotecas complejas, hay soluciones que hacen la vida un poco más fácil como buildroot o ptxdist. Estos programas construyen núcleos de Linux y sistemas de archivos raíz completos para dispositivos integrados.

Sin embargo, en su caso, siempre que solo desee ncurses, puede compilar el código fuente usted mismo. Solo necesita descargar las fuentes, ejecutar configure mientras especifica su cadena de herramientas usando la opción --host . La opción --prefix elegirá el directorio de instalación. Después de ejecutar make y make install , considerando que todo salió bien, tendrá un conjunto de encabezados y la biblioteca compilada por ARM para que su aplicación se vincule.

Con respecto a la compilación cruzada, seguramente encontrará mucha información en Internet y tal vez ncurses tenga también algunos consejos en su documentación enviada.


En cuanto a su primera pregunta, si tiene la intención de usar la biblioteca ncurses con su cadena de herramientas de compilación cruzada, tendrá preparados sus archivos binarios integrados.

Su segunda pregunta es cómo funciona con std libs, bueno, realmente NO es el sistema libc / libm que está utilizando la cadena de herramientas para compilar / vincular el programa. Tal vez lo vea desde la opción --print-file-name = de su compilador:

arm-none-linux-gnuabi-gcc --print-file-name=libm.a ...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libm.a arm-none-linux-gnuabi-gcc --print-file-name=libpthread.so ...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libpthread.so

Creo que tu cadena de herramientas de frambuesa podría ser la misma. Puedes probar esto.


La respuesta de Vinay es bastante sólida. Solo una corrección al compilar la biblioteca ncurses para la frambuesa pi, la opción para configurar tus --sysroot=<dir> es --sysroot=<dir> y no --with-sysroot . Eso es lo que encontré cuando estaba usando el siguiente compilador:

arm-linux-gnueabihf-gcc --version arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) 4.8.3 20140303 (prerelease) Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Para la consulta How the C library works in cross-tools

Al compilar y construir la cadena de herramientas cruzadas durante la configuración, proporcionarán sysroot.

como --with-sysroot=${CLFS_CROSS_TOOLS}

--with-sysroot --with-sysroot=dir

Tells GCC to consider dir as the root of a tree that contains (a subset of) the root filesystem of the target operating system. Target system headers, libraries and run-time object files will be searched for in there. More specifically, this acts as if --sysroot=dir was added to the default options of the built compiler. The specified directory is not copied into the install tree, unlike the options --with-headers and --with-libs that this option obsoletes. The default value, in case --with-sysroot is not given an argument, is ${gcc_tooldir}/sys-root. If the specified directory is a subdirectory of ${exec_prefix}, then it will be found relative to the GCC binaries if the installation tree is moved.

Así que en lugar de buscar /lib /usr/include se verá / Toolchain / (libc) e (incluir archivos) cuando se compile

puedes comprobar por

arm-linux-gnueabihf-gcc -print-sysroot

este show donde buscar libc.

además

arm-linux-gnueabihf-gcc -print-search-dirs

te da una imagen clara