Creando una aplicación de 32 bits en Ubuntu de 64 bits

20

Después de horas de búsqueda en Google, decido rendirme y preguntarte expertos. Estoy tratando de construir una aplicación de 32 bits (xgap si alguien está interesado) en mi 64 Ubuntu 11.10. Agregué el CFLAGS = -m32 y el LDFLAGS = -L / usr / lib32 en el archivo MAKE. Los objetos están integrados en 32 bits finos. El último paso es vincular todos los objetos y bibliotecas para ventanas X en este archivo ejecutable --- xgap. De alguna manera me sigue dando este error:

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

He instalado ia32-libs y compatibilidad con mutilib . Creo que solo necesito forzar al enlazador a generar una salida de i386. Traté de poner dos banderas ld en mi comando gcc como se muestra arriba: -melf_i386 y -oformat elf32-i386 . Pero lo que sucede es que gcc ya no busca la biblioteca de 32 bits en / usr / lib32 . Me pregunto si necesito poner esas banderas en un orden fijo.

¡Gracias por cualquier idea y ayuda!

EDITAR: cuando agrego el indicador -m32 en mi último comando gcc (creo que la etapa de enlace), incluso si tengo el indicador -L / usr / lib32 en su lugar, gcc no busca en / usr / lib32 más (realmente extraño ...) y genera el siguiente error:

/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

¿Alguien tiene alguna idea de por qué sucede esto? Estoy usando la herramienta automática para configurar y hacer. Soy muy bueno modificando esos archivos de script.

EIDT : resolví el problema. Creo que gcc esperaba un archivo de biblioteca estática. Utilicé el script getlibs de enlace para descargar todos los archivos .a necesarios para vincular . Entonces gcc funcionó. Creo que gcc realizó una búsqueda en el directorio / usr / lib32 , pero no encontró los archivos .a , así que siguió buscando en el directorio estándar que es / usr / lib , donde encuentra los archivos incompatibles *. entonces .

Pero entonces la pregunta es: los archivos *. entonces en / usr / lib32 / del paquete ia32-libs en realidad no lo hacen tener las bibliotecas necesarias para vincular? ¿Para qué se usan esos archivos en / usr / lib32 / ?

    
pregunta Rich 07.12.2011 - 19:53

2 respuestas

13

LDFLAGS también debe incluir -m32 . Lo siguiente debería funcionar:

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

De hecho, puedes eliminar -L/usr/lib32 part, ya que este es un directorio predeterminado para libs de 32 bits, y tu sistema es consciente de eso.

Básicamente, la forma más sencilla de compilar aplicaciones de 32 bits en una máquina de 64 bits es:

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

.. o alimentar esas variables para configurar el script si está utilizando autotools.

ACTUALIZACIÓN:

Parece que no está familiarizado con las diferencias en vincular bibliotecas estáticas y dinámicas. Trataré de ser lo más mínimo posible:

  • Tanto las bibliotecas de desarrollo estáticas como las dinámicas tienen la misma extensión de archivo .a
  • Si ha instalado versiones estáticas y dinámicas de la misma biblioteca, una de ellas podría tener un sufijo adicional, como libname.a para dinámico y libname_s.a para la versión estática.
  • Claro, las versiones de bibliotecas estáticas y dinámicas difieren en tamaño. La versión estática es más pesada.
  • Si enlaza con la biblioteca estática, su aplicación no tiene dependencias. Si enlaza con la biblioteca dinámica, dependerá de la biblioteca de% r_% de tiempo de ejecución% que debe estar presente en su sistema.

Tenga en cuenta que no estamos hablando de trucos avanzados aquí, como la carga explícita de DSO utilizando la API dlopen () / dlsym ().

    
respondido por el Andrejs Cainikovs 07.12.2011 - 19:59
6

Recibía errores como:

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

Esto lo solucionó para mí:

sudo apt-get install g++-multilib

si está utilizando un paquete gcc distinto del predeterminado (por ejemplo, gcc-7 ), deberá instalar el paquete para esa versión específica:

sudo apt-get install g++-7-multilib
    
respondido por el Vladimir Panteleev 28.06.2014 - 12:33

Lea otras preguntas en las etiquetas