linux gcc 64bit cmake 32-bit

Cómo compilar un binario de 32 bits en una máquina Linux de 64 bits con gcc/cmake



64bit 32-bit (6)

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

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

No sé de una manera de hacerlo globalmente.

¿Es posible compilar un proyecto en 32 bits con cmake y gcc en un sistema de 64 bits ? Probablemente lo sea, pero ¿cómo lo hago?

Cuando lo probé de la manera "ignorante", sin establecer parámetros / indicadores / etc, simplemente estableciendo LD_LIBRARY_PATH para encontrar las bibliotecas vinculadas en ~/tools/lib , parece ignorarlo y solo buscar en los subdirectorios llamados lib64 .


Para C ++, podrías hacer:

export CXXFLAGS=-m32

Esto funciona con cmake.


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

Por ejemplo, aquí hay una manera de crear vino de 32 bits utilizando lxc en un sistema Ubuntu Trusty:

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 cómo crear vino de 32 bits en un host de 64 bits usando lxc .


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


$ 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: use la bandera -m32 para compilar un binario de 32 bits.

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


export CFLAGS=-m32