Como compilar um binário de 32 bits em uma máquina Linux de 64 bits com gcc / cmake

129

É possível compilar um projeto em 32 bits com cmakee gccem um sistema de 64 bits ? Provavelmente é, mas como faço isso?

Quando tentei da maneira "ignorante", sem definir nenhum parâmetro / sinalizador / etc, basta definir LD_LIBRARY_PATHpara encontrar as bibliotecas vinculadas ~/tools/libque parece ignorá-lo e procurar apenas nos subdiretórios chamados lib64 .

dala
fonte
1
Seria suficiente passar a flag -m32 para o gcc? Como eu faria isso no cmake?
dala

Respostas:

124
export CFLAGS=-m32
caf
fonte
2
Deveria fazer. Você também pode modificar o script cmake para criar um destino de 32 bits - ele apenas adicionaria -m32ao CFLAGS, provavelmente configurando CMAKE_REQUIRED_FLAGS.
caf
5
Bem, o problema é que isso não é necessariamente suficiente. Você pode precisar ajustar o vinculador também!
Lpapp #
6
O que exportsignifica isso ? Onde ele pertence? Te cabeçalho arquivos? O makefile? Não, totalmente não é uma resposta para mim como iniciante.
Tomáš Zato - Restabelecer Monica
1
@ TomášZato: No prompt do shell, antes de invocar cmake(no entanto, no seu caso, se você tiver um Makefile, você estaria usando make).
caf
4
@caf, você poderia elaborar sua resposta? Sua resposta é muito concisa e não explica nada.
quer
76
$ gcc test.c -o testc
$ arquivo testc
testc: Executável ELF de 64 bits LSB, x86-64, versão 1 (SYSV), vinculado dinamicamente (usa bibliotecas compartilhadas), para GNU / Linux 2.6.9, sem remoção
$ 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
$ arquivo testc
testc: Executável ELF de 32 bits LSF, Intel 80386, versão 1 (SYSV), vinculado dinamicamente (usa bibliotecas compartilhadas), para GNU / Linux 2.6.9, sem remoção
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

Em resumo: use o -m32sinalizador para compilar um binário de 32 bits.

Além disso, verifique se você tem as versões de 32 bits de todas as bibliotecas necessárias instaladas (no meu caso, tudo que eu precisava no Fedora era glibc-devel.i386)

andri
fonte
1
Muito obrigado! Sim, eu tenho versões de 32 bits das dependências.
dala
6
Como posso instalar versões de 32 bits das bibliotecas?
Tomáš Zato - Restabelecer Monica
2
@ TomášZatosudo apt-get install gcc-multilib
Matthew Murdoch
16

Nas versões posteriores do CMake, uma maneira de fazer isso em cada destino é:

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

Não sei como fazer isso globalmente.

Nathan Monteleone
fonte
+1. Estou tentando criar taglib de 32 bits ( developer.kde.org/~wheeler/taglib.html ) em um snow leopard de 64 bits. Isso funciona para mim.
Edwardw
3
… Para fazer isso globalmente:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas
7

Para C ++, você pode fazer:

export CXXFLAGS=-m32

Isso funciona com o cmake.

euccas
fonte
6

Uma maneira é configurar um ambiente chroot. O Debian tem várias ferramentas para isso, por exemplo, debootstrap

Dirk Eddelbuettel
fonte
2
Parece um pouco extremo configurar um ambiente chroot apenas para criar aplicativos de 32 bits, não é? Alguma razão específica para você recomendar isso?
11409 Fredrik
3
Ele fornece um ambiente completo no qual também é possível executar o código. Usamos isso para criar (e executar) binários completos de 32 bits em hosts de 64 bits - às vezes você obtém apenas compilações de 32 bits de bibliotecas de terceiros. Para o trabalho Debian, nós o usamos para criar pacotes de 32 bits em hosts de 64 bits.
Dirk Eddelbuettel 13/08/09
Eu nunca tive problemas com o desenvolvimento e a execução de binários completos de 32 bits no linux, Solaris ou em qualquer outra plataforma de 64 bits. Mas não estou usando muito o Debian.
1155 Fredrik
Frederik, você também os implementa em 32 bits no host de compilação de 64 bits?
Dirk Eddelbuettel 13/08/09
@Dirk: os binários de 32 bits funcionam em máquinas de 32 e 64 bits (é claro), os binários de 64 bits funcionam apenas em máquinas de 64 bits. Não importa se é uma máquina do cliente ou um host de construção. Sinceramente, não vejo onde estaria o problema, a menos que sejam os módulos do kernel que você está construindo.
1155 Fredrik
6

Para qualquer aplicação complexa, sugiro usar um contêiner lxc . Os contêineres lxc são 'algo no meio entre um chroot com esteróides e uma máquina virtual completa'.

Por exemplo, aqui está uma maneira de criar vinho de 32 bits usando lxc em um 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

Aqui está a página wiki sobre como criar o vinho de 32 bits em um host de 64 bits usando o lxc .

Sam Watkins
fonte
interessante. Posso usá-lo para compilar o atomeditor de texto para 32 bits na máquina de 64 bits?
Anwar
1
@ Anwar, acho que sim. Deveria trabalhar para construir qualquer coisa.
Sam Watkins