Construindo um aplicativo de 32 bits no Ubuntu de 64 bits

22

Depois de horas pesquisando no Google, decido desistir e pedir a você especialistas. Estou tentando criar um aplicativo de 32 bits (xgap se alguém estiver interessado) no meu 64 Ubuntu 11.10. I adicionou-se o CFLAGS = -m32 e o LDFLAGS = -L / usr / lib32 no makefile. Os objetos são incorporados em 32 bits. O último passo é vincular todos os objetos e bibliotecas das janelas X neste executável --- xgap. De alguma forma, ele continua me dando este 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 o ia32-libs e o suporte a mutilib . Eu acho que só preciso forçar o vinculador a gerar uma saída i386. Tentei colocar dois sinalizadores 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 . Será que preciso colocar essas bandeiras em alguma ordem fixa?

Obrigado por qualquer idéia e ajuda!

EDIT: quando adiciono o sinalizador -m32 no meu último comando gcc (o estágio de vinculação que acredito), mesmo se eu tiver o sinalizador -L / usr / lib32 no lugar, o gcc não pesquisará mais em / usr / lib32 (realmente 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? Estou usando a ferramenta automática para configurar e criar. Eu sou realmente bom em modificar esses arquivos de script.

EIDT : Eu resolvi o problema. Eu acho que o gcc estava esperando um arquivo de biblioteca estática. Eu usei o script getlibs em http://ubuntuforums.org/showthread.php?t=474790 para baixar todos os arquivos .a necessários para vincular. Então gcc trabalhou. Eu acho que o gcc pesquisou no diretório / usr / lib32 , mas não encontrou os arquivos .a, então procurou no diretório padrão que é / usr / lib , onde encontra os arquivos * .so incompatíveis .

Mas, então, a pergunta é: o * .so arquivos em / usr / lib32 / do pacote ia32-libs não realmente ter as bibliotecas necessárias para vincular? Para que são usados esses arquivos em / usr / lib32 / ?

Rico
fonte
relacionada stackoverflow.com/questions/22355436/...
Ciro Santilli新疆改造中心法轮功六四事件

Respostas:

15

LDFLAGSdeve incluir -m32também. A seguir, deve funcionar:

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

De fato, você pode descartar -L/usr/lib32parte, 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 criar aplicativos 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 ferramentas automáticas.

ATUALIZAR:

Parece que você não está realmente 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ático e dinâmico têm a mesma extensão de arquivo .a
  • Se você instalou as versões estática e dinâmica da mesma biblioteca, uma delas pode ter postfix adicional, como libname.ana libname_s.aversão dinâmica e estática.
  • As versões de bibliotecas estáticas e dinâmicas são diferentes em tamanho. A 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 .sobiblioteca de tempo de execução que deve estar presente no seu sistema.

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

Andrejs Cainikovs
fonte
Agora acho que há algo errado com minha configuração. Sempre que adiciono o -m32 no meu último comando gcc, ele pesquisa a pasta / usr / lib. Se eu não adicionar -m32 e usar o sinalizador -L / usr / lib32, ele pesquisará o diretório correto, mas gerará os erros acima. Você sabe o que poderia causar isso?
Rico
E o que acontecerá se você combinar os dois (como no meu exemplo acima)?
Andrejs Cainikovs
se eu combinar os dois, ele ainda não pesquisará em / usr / lib32. apenas procura em / usr / lib. E aliás, estou usando ferramentas automáticas.
Rico
Estranho .. Você tentou se alimentar -l/usr/lib32/libXaw.so?
Andrejs Cainikovs
Ele não pode encontrá-los ....: gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / Você também pode usar o comando libr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / O comando usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: não pode encontrar -l / usr / lib32 / libXaw.so
Rich
8

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 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
Vladimir Panteleev
fonte
1
g++-multilibé para g ++ (C ++), para gcc (C) você também precisa gcc-multilib.
pevik 04/10/19