Criando um aplicativo de 32 bits no Ubuntu de 64 bits

20

Depois de horas pesquisando, eu decidi desistir e perguntar a você especialistas. Eu estou tentando construir um aplicativo de 32 bits (xgap se alguém estiver interessado) no meu 64 Ubuntu 11.10. Eu adicionei o CFLAGS = -m32 e o LDFLAGS = -L / usr / lib32 no makefile. Os objetos são construídos em 32 bits bem. O último passo é vincular todos os objetos e bibliotecas para o X Window neste executável --- xgap. De alguma forma, continua me dando esse erro:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file 'xcmds.o' is incompatible with i386:x86-64 output
...

Eu instalei ia32-libs e suporte a mutilib . Eu acho que só preciso forçar o linker para gerar uma saída i386. Eu tentei colocar dois flags ld no meu comando gcc como mostrado acima: -melf_i386 e -oformat elf32-i386 . Mas o que acontece é que o gcc não procura mais a biblioteca de 32 bits em / usr / lib32 . Gostaria de saber se preciso colocar essas bandeiras em alguma ordem fixa?

Obrigado por qualquer ideia e ajuda!

EDIT: quando eu adiciono o sinalizador -m32 no meu último comando gcc (o estágio de link acredito), mesmo que eu tenha o sinalizador -L / usr / lib32 no lugar, o gcc não procura em / usr / lib32 mais (muito estranho ...) e gera o seguinte erro:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

Alguém tem alguma idéia de por que isso acontece? Eu estou usando a ferramenta automática para configurar e fazer. Eu sou muito bom em modificar esses arquivos de script.

EIDT : resolvi o problema. Eu acho que o gcc estava esperando um arquivo de biblioteca estática. Eu usei o script getlibs do link para baixar todos os arquivos .a necessários para vincular . Então o gcc funcionou. Eu acho que o gcc pesquisou no diretório / usr / lib32 mas não encontrou os arquivos .a então passou a procurar no diretório padrão que é / usr / lib , onde encontra os arquivos *. so incompatíveis.

Mas a questão é: os arquivos *. so em / usr / lib32 / do pacote ia32-libs não são realmente tem as bibliotecas necessárias para vincular? Quais são os arquivos em / usr / lib32 / usados para?

    
por Rich 07.12.2011 / 20:53

2 respostas

13

LDFLAGS deve incluir -m32 também. A seguir deve funcionar:

export LDFLAGS='-m32 -L/usr/lib32'

Na verdade, você pode descartar -L/usr/lib32 part, já que este é um diretório padrão para bibliotecas de 32 bits, e seu sistema está ciente disso.

Basicamente, a maneira mais simples de construir aplicações de 32 bits em máquinas de 64 bits é:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. ou alimente essas variáveis para configurar o script se você estiver usando autotools.

ATUALIZAÇÃO:

Parece que você não está familiarizado com as diferenças de vinculação com bibliotecas estáticas e dinâmicas. Vou tentar ser o mínimo possível:

  • As bibliotecas de desenvolvimento estáticas e dinâmicas possuem a mesma extensão de arquivo .a
  • Se você instalou versões estáticas e dinâmicas da mesma biblioteca, uma delas pode ter um postfix adicional, como libname.a para dinâmico e libname_s.a para versão estática.
  • Certamente, as versões de biblioteca estática e dinâmica diferem em tamanho. Versão estática é mais pesada.
  • Se você vincular à biblioteca estática - seu aplicativo não terá dependências. Se você vincular à biblioteca dinâmica, ela dependerá da biblioteca de tempo de execução .so que deve estar presente em seu sistema.

Por favor, note que não estamos falando de truques avançados aqui, como o carregamento explícito de DSOs usando a API dlopen () / dlsym ().

    
por Andrejs Cainikovs 07.12.2011 / 20:59
6

Eu estava recebendo erros como:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

Isso corrigiu para mim:

sudo apt-get install g++-multilib

se você estiver usando um pacote do gcc diferente do padrão (por exemplo, gcc-7 ), será necessário instalar o pacote para essa versão específica:

sudo apt-get install g++-7-multilib
    
por Vladimir Panteleev 28.06.2014 / 14:33

Tags