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 / ?
Respostas:
LDFLAGS
deve incluir-m32
também. A seguir, deve funcionar:De fato, você pode descartar
-L/usr/lib32
parte, 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 é:
..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:
.a
libname.a
nalibname_s.a
versão dinâmica e estática..so
biblioteca 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 ().
fonte
-l/usr/lib32/libXaw.so
?Eu estava recebendo erros como:
Isso corrigiu para mim:
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:fonte
g++-multilib
é para g ++ (C ++), para gcc (C) você também precisagcc-multilib
.