Existe uma maneira geral de construir projetos de 32 bits no sistema de 64 bits?

4

Eu tenho um projeto que deve ser executado em todas as plataformas a seguir:

  • Win x86
  • Win x64
  • Linux (Debian) x86
  • Linux (Debian) x64

Vou terminar com o Windows e o Linux x64 compilado, embora não tenha certeza de que funcione. Há uma plataforma em falta e isso é o Linux x86. Eu tenho um makefile que não se preocupa com x64 / x32. Eu preciso adicionar uma configuração de 32 bits. Eu aprendi que posso fazer isso com make :

make configuration CFLAGS=-m32

Mas eu não tenho tanta certeza se ele realmente compila 32bits - quando eu usei esse comando, nenhuma compilação ocorreu 1 e o programa pulou direto para a fase de vinculação, onde de fato reclamava sobre bibliotecas incompatíveis 2 :

/usr/bin/ld: cannot find -lboost_system
/usr/bin/ld: skipping incompatible /usr/lib//liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible /usr/lib//liblog4cplus.a when searching for -llog4cplus
/usr/bin/ld: skipping incompatible /usr/local/lib/liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../liblog4cplus.a when searching for -llog4cplus
/usr/bin/ld: skipping incompatible //usr/local/lib/liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible //usr/lib/liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible //usr/lib/liblog4cplus.a when searching for -llog4cplus
/usr/bin/ld: cannot find -llog4cplus
/usr/bin/ld: skipping incompatible /usr/local/ssl/lib//libcrypto.a when searching for -lcrypto
/usr/bin/ld: cannot find -lcrypto

Isso gera duas perguntas sobre as pessoas que estão acostumadas a desenvolver programas de multi-arquitetura:

  1. Como devo gerenciar bibliotecas? E eu tenho que construir manualmente todos eles?
  2. Como fazer corretamente o makefile? Eu suponho que a versão de 32 bits e a versão de 64 bits devem ser construídas em locais diferentes ...

Nota 1: notei que isto acontece porque não make clean . Ainda assim, os 64 bits e 32 bits não devem compartilhar pastas.
Nota 2: Isso inclui -lstdc++ - a biblioteca padrão C ++. Isso significa que eu nem tenho esse.

    
por Tomáš Zato 29.09.2015 / 14:35

1 resposta

1

Você precisa configurar seus scripts de construção para que os arquivos de objeto para diferentes arquiteturas sejam gravados em diretórios diferentes. Naturalmente não haverá conflitos entre objetos do Windows e objetos Unix porque eles usam nomes de arquivos diferentes ( *.obj e *.exe vs. *.o e * ), mas os sistemas Unix usam os mesmos nomes de arquivos.

Como alternativa, descompacte as fontes em diretórios diferentes para cada compilação.

Em relação às bibliotecas, você precisará instalar pacotes de desenvolvimento de 32 bits ( …:i386 ) juntamente com os pacotes nativos de 64 bits. Como alternativa, configure uma instalação de 32 bits em um chroot , que usa alguns GB de espaço em disco, mas tem uma manutenção muito baixa e é a maneira mais fácil de produzir pacotes de forma confiável para outras distribuições diferentes da que você está executando.

    
por 30.09.2015 / 02:50