2009-08-13 23 views
113

¿Es posible compilar un proyecto en de 32 bits concmake y gcc en un sistema de 64 bits ? Probablemente lo sea, pero ¿cómo lo hago?como compilar un binario de 32 bits en una máquina Linux de 64 bits con gcc/cmake

Cuando lo probé el camino "ignorante", sin establecer parámetros/banderas/etc, sólo la creación de LD_LIBRARY_PATH para encontrar las librerías enlazadas en ~/tools/lib que parece ignorarlo y sólo se ven en subdirectorios llamados lib64.

+0

¿Sería suficiente para pasar a la -m32 bandera para gcc? ¿Cómo podría hacer eso en cmake? – dala

+0

duplicado Posible de [La manera adecuada de forzar una compilación de 32 bits usando CMake] (https://stackoverflow.com/questions/5805874/the-proper-way-of-forcing-a-32-bit-compile-using -cmake) – maxschlepzig

Respuesta

111
export CFLAGS=-m32 
+0

Ya veo. Una solución tan fácil ... – dala

+0

Supongo que esto funcionará en combinación con cmake? – dala

+2

Debería hacer. También podría modificar el script cmake para crear un objetivo de 32 bits; simplemente agregaría '-m32' al' CFLAGS', probablemente estableciendo 'CMAKE_REQUIRED_FLAGS'. – caf

4

Una forma es configurar un entorno chroot. Debian tiene una serie de herramientas para que, por ejemplo debootstrap

+2

Se siente un poco extremo para configurar un entorno chroot solo para crear aplicaciones de 32 bits, ¿no? ¿Alguna razón en particular por la que recomiendas eso? – Fredrik

+0

¿Cómo funciona eso, exactamente? – Hasturkun

+2

Le brinda un entorno completo para ejecutar código. Usamos eso para construir (y ejecutar) binarios completos de 32 bits en hosts de 64 bits; a veces solo se obtienen compilaciones de 32 bits de bibliotecas de terceros. Para el trabajo de Debian, lo usamos para compilar paquetes de 32 bits en hosts de 64 bits. –

70
 
$ gcc test.c -o testc 
$ file testc 
testc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped 
$ ldd testc 
    linux-vdso.so.1 => (0x00007fff227ff000) 
    libc.so.6 => /lib64/libc.so.6 (0x000000391f000000) 
    /lib64/ld-linux-x86-64.so.2 (0x000000391ec00000) 
$ gcc -m32 test.c -o testc 
$ file testc 
testc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped 
$ ldd testc 
    linux-gate.so.1 => (0x009aa000) 
    libc.so.6 => /lib/libc.so.6 (0x00780000) 
    /lib/ld-linux.so.2 (0x0075b000) 

En resumen: usar la bandera -m32 para compilar un binario de 32 bits.

Además, asegúrese de que tiene las versiones de 32 bits de todas las bibliotecas necesarias instaladas (en mi caso todo lo que necesitaba en Fedora fue glibc-devel.i386)

+1

¡Muchas gracias! Sí, tengo versiones de 32 bits de las dependencias. – dala

+6

¿Cómo puedo instalar versiones de 32 bits de las bibliotecas? –

+1

@ TomášZato 'sudo apt-get install gcc-multilib' –

15

En versiones posteriores de CMake, una forma de hacerlo en cada objetivo:

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

no sé de una manera de hacerlo a nivel mundial.

+0

+1. Estoy intentando construir taglib de 32 bits (http://developer.kde.org/~wheeler/taglib.html) en un leopardo de las nieves de 64 bits. Esto funciona para mí – edwardw

+2

... para hacerlo globalmente: 'cmake -D CMAKE_CXX_FLAGS = -m32. && make' – dyomas

5

Para cualquier aplicación compleja, sugiero utilizar un lxc container. Los contenedores lxc son "algo en el medio entre un chroot con esteroides y una máquina virtual completa".

Por ejemplo, aquí es una manera de construir el vino de 32 bits utilizando lxc en un sistema de confianza Ubuntu:

sudo apt-get install lxc lxc-templates 
sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty 
sudo lxc-start -n my32bitbox 
# login as yourself 
sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list" 
sudo apt-get install devscripts 
sudo apt-get build-dep wine1.7 
apt-get source wine1.7 
cd wine1.7-* 
debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b 
shutdown -h now # to exit the container 

Aquí está la página wiki sobre how to build 32-bit wine on a 64-bit host using lxc.

+0

interesante. ¿Puedo usarlo para compilar el editor de texto 'atom' para 32 bits en una máquina de 64 bits? – Anwar

+1

@Anwar, supongo que sí. Debería funcionar para construir cualquier cosa. –

+1

Estoy verificando, esto funciona – Anwar

4

para C++, se puede hacer:

export CXXFLAGS=-m32 

Esto funciona con cmake.

Cuestiones relacionadas