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 .


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

Respostas:


124
export CFLAGS=-m32

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)


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.


+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.


6

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


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 .


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.