2009-09-09 17 views
13

He descargado el código fuente "boost" (1.40.0) desde su página de inicio "www.boost.org". Tengo Linux (Ubuntu 9.04 Jaunty) instalado e intento compilar las bibliotecas de impulso a la versión "WINDOWS" (por ejemplo, ".dll", NO ".so") de mi máquina "LINUX".Boost - compilación cruzada - "de Linux" "a Windows"

Y ahora una pregunta importante:

ES POSIBLE compilación para las "ventanas" Bibliotecas impulso de "Linux" (si alguien decir "sí" Voy a confiar en él sólo si ya lo ha hecho antes de escribiremos aquí una solución que funcionará para mí. Perdón por ese pesimismo pero estoy tratando de hacer esto durante 3 días y nada positivo hasta el momento) ?

Hasta ahora he compilado programas de C++ de esta manera. Para compilar desde Linux a Linux he usado el compilador "gcc" (o "g ++"). Para compilar desde Linux a Windows, he usado el compilador "i586-mingw32msvc-gcc" (o "i568-mingw32msvc-g ++") (que está incluido en el paquete "mingw32" para "Ubuntu", por ejemplo).

Así que esta estrategia que han querido utilizar también para compilar las bibliotecas Boost y me han tratado esto hasta ahora (después de leer el artículo "Introducción" en la página principal impulso):

--1. He ejecutado "bootstrap.sh" desde el directorio de código fuente de impulso "raíz":

./bootstrap.sh 

--2. Entonces he cambiado algo en el archivo "proyecto-config.jam" (de "usando gcc;"):

using gcc : : i586-mingw32msvc-gcc ; 

--3. Y, por último ejecutar "bjam" ejecutable:

./bjam stage 

Pero en lugar de la creación de la versión "Windows" de las bibliotecas Boost Tengo un montón de errores-mensajes.

¿Alguien me puede ayudar?

Gracias de antemano.

Petike

+4

OK, voy a morder: ¿Por qué demonios querrías hacer esto de todos modos? ¿Por qué no compilar boost para Windows en Windows? – sbi

+13

@sbi, ¿por qué no? ¿Qué pasa si Windows no está disponible? ¿y si no puedes pagarlo? ¿Y si necesita la conveniencia de compilar para diferentes plataformas desde una sola plataforma? –

Respuesta

0

Boost hace suposiciones acerca de su sistema operativo y versión actual basada en el sistema actual. ¿Qué pasaría si tuviera acceso a los archivos de encabezado de win32, elimine todos los encabezados de Linux de la ruta de inclusión y luego intente compilar?

0

Esto no es realmente una respuesta, pero: ¡no!

La compilación cruzada a una plataforma completamente diferente suele ser un gran dolor en el ****.

Si está intentando construir los binarios de Windows en la misma máquina, por ejemplo, para empaquetar, use una máquina virtual con Windows, mingw y scripts apropiados.

Luego, incluso puede ejecutar pruebas automatizadas en el vm, etc. con su compilación, lo que debería ser una gran ventaja.

+3

esto no es aceptable –

+3

Bueno, funciona. "Aceptable" o no. – AndreasT

+2

Un buen punto acerca de poder ejecutar las pruebas automatizadas, eso es algo que no se puede hacer en un entorno de compilación cruzada. – Malvineous

10

La documentación oficial tiene una sección en cross compilation.Al comparar esto con lo que está haciendo, hay dos cuestiones:

  1. usted especifique i586-mingw32msvc-gcc y debe especificar i586-mingw32msvc-g ++. El primero es un compilador de C, que es un poco difícil de usar para compilar C++ código base ;-)

  2. Es necesario apuntar-os = ventanas

Tenga en cuenta que hay un fallo conocido allí - cuando creando bibliotecas estáticas, no se pasan a través de ranlib, y mingw linker está específicamente molesto por esto. Debería ejecutar ranlib manualmente si planea usar bibliotecas estáticas.

+0

Lo probé con "i586-mingw32msvc-g ++" y "target-os = windows" pero no se ha construido nada y obtuve las siguientes 20 líneas de errores. Parece que tendré que compilar las bibliotecas desde "Windows" (¿u otra solución?). – Petike

+1

Déjame intentar determinar lo que hice con más precisión. Tengo SVN HEAD o Boost, y tengo esto en mi user-config.jam: "usando gcc: m: i586-mingw32msvc-g ++;". Luego ejecuto: "bjam toolset = gcc-m target-os = windows variant = debug --with-program_options". Veo que se ejecutan los comandos y, finalmente, se crea stage/lib/libboost_program_options.lib. ¿Puedes tratar de hacer exactamente lo mismo? Si funciona, entonces proporcione los errores que obtiene en su uso. Si no funciona, entonces también proporcione errores. Imagino que los errores no encajarán en SO, así que use http://codepad.org –

+3

Finalmente me funciona. Estaba equivocado, solo he intentado compilar la biblioteca "hilo" y no "todo". Y no se pudo compilar el hilo porque no pudo encontrar "pthreads". Solo agregué: "threadapi = win32" y después de eso estaba bien. Así que todo el comando es: "./bjam --layout = variante del sistema = release threading = enlace múltiple = shared runtime-link = shared toolset = gcc target-os = windows threadapi = win32 stage". Pero todavía no puedo compilar estas bibliotecas: -graph -graph_parallel -iostreams -Matemáticas (en parte) -python Los otros pueden ser compilados. – Petike

3

No es un procedimiento muy simple de seguir a cruz impulso acumulación de Linux a Windows aquí:

https://web.archive.org/web/20110604002004/http://www.vle-project.org/wiki/Cross_compilation_Win32

+0

Muy bien, esto sigue funcionando (¡al menos se construye sin errores, no ha intentado ejecutarlo)! – Luminger

+0

+1 ¡Funcionó para mí también! –

+2

Esto parece haber funcionado para mí, contra boost 1.48.0 en Ubuntu 12.04. Elthariel, podría ser una buena idea que expanda su respuesta para incluir el contenido de ese enlace, en caso de que el enlace se quede obsoleto. Te retribuiré si lo haces. –

2

Se trata de los comandos que utilizo. Los he probado para aumentar 1.46 y 1.49.

Para comenzar, cree enlaces al compilador dentro de/usr/i686-w64-mingw32/bin. Puede ejecutar este script:

#!/bin/bash 

binDir="/usr/bin" 
destDir="/usr/i686-w64-mingw32/bin" 

cd "$binDir" 
mkdir -p "$destDir" 

for name in $(ls i686-w64-mingw32*); do 
    newName=$(echo "$name" | sed 's/i686-w64-mingw32-//g') 
    if [ -f "$destDir/$newName" ]; then 
     rm "$destDir/$newName" 
    fi 
    ln -s "$binDir/$name" "$destDir/$newName" 
done 

Luego, instale bjam. En Ubuntu/Debian, se incluye en el paquete "libboost1.48-dev"

apt-get install libboost1.48-dev 

Para finalizar, root y ejecutar

env PATH=/usr/i686-w64-mingw32/bin:$PATH bjam toolset=gcc target-os=windows variant=release threading=multi threadapi=win32 link=static --prefix=/usr/i686-w64-mingw32 -j 4 --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged install 

hecho!

+0

Me doy cuenta de que han pasado dos años desde su respuesta, pero: ¿de qué se trata este 'autoRegex'? ¿Por qué no "sed 's/i686-w64-mingw32 - // g'"? –

+0

Es un script presente en mi computadora, que solo hace un sed. Modifiqué mi respuesta de acuerdo a tu sugerencia. – Congelli501

+0

Aparece el siguiente error: Propiedad no válida ' win32': función desconocida 'threadapi'. La biblioteca de Boost es una versión un poco más nueva. –

Cuestiones relacionadas