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
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
.
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"
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.
- 1. Cómo descargar automáticamente las dependencias C++ de forma cruzada + CMake?
- 2. Una forma de compilar la biblioteca C en .Net dll?
- 3. ¿Debo compilar de forma cruzada en Linux o Windows?
- 4. Biblioteca estática con dependencias
- 5. C++ Buildsystem con capacidad para compilar dependencias de antemano
- 6. ¿Hay una biblioteca de plataforma cruzada C++?
- 7. Cómo compilar una biblioteca con formularios WPF
- 8. ¿Cómo compilar una biblioteca estática en Linux?
- 9. Compilar C++ con Cygwin
- 10. ¿Es posible compilar en forma cruzada código fuente D para MIPS?
- 11. Requerimientos de compilación cruzada para C
- 12. Biblioteca estática de compilación cruzada de Linux para Windows
- 13. Comenzando con un proyecto de C + + de plataforma cruzada
- 14. ¿Cómo compilar la aplicación C# con la biblioteca estática de C++?
- 15. Cola C++ con dependencias
- 16. ¿Cómo compilar Haskell a una biblioteca estática?
- 17. Mejor forma de compilar el código de biblioteca
- 18. ¿Hay una biblioteca que pueda compilar C++ o C
- 19. CMAKE: compilar biblioteca y vincularla
- 20. Compilación cruzada con SBCL
- 21. Compilar una biblioteca compartida estáticamente
- 22. cómo compilar la biblioteca de subprocesos
- 23. Plataforma cruzada ligera C GUI (OpenGL)
- 24. Tratando con dependencias opcionales (C#)
- 25. Biblioteca c de código abierto de compilación cruzada para iOS y Xcode 4.3
- 26. ¿Cómo compilar OpenCV con libjpeg-turbo?
- 27. Administración de dependencias de biblioteca usando git
- 28. compilación cruzada brazo de C++ a iphone
- 29. ctypes cargando una biblioteca compartida c que tiene dependencias
- 30. ¿Forma de plataforma cruzada para producir un hilo en C/C++?