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

23

Después de horas de buscar en Google, decido rendirme y pedirles expertos. Estoy tratando de construir una aplicación de 32 bits (xgap si alguien está interesado) en mi 64 Ubuntu 11.10. Añadí la CFLAGS = -m32 y la LDFLAGS = -L / usr / lib32 en el makefile. Los objetos están integrados en 32 bits bien. El último paso es vincular todos los objetos y bibliotecas para X windows en este 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 soporte de mutilib . Creo que solo necesito forzar el enlazador para generar una salida 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 (la etapa de vinculación, creo), incluso si tengo el indicador -L / usr / lib32 en su lugar, gcc ya no busca en / usr / lib32 (realmente raro ...) 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 realmente 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 http://ubuntuforums.org/showthread.php?t=474790 para descargar todos los archivos .a necesarios para vincular. Entonces gcc funcionó. Creo que gcc hizo la búsqueda en / usr / lib32 directorio, pero no encontró los .a archivos así que fuimos a buscar en el directorio estándar que es / usr / lib , donde se encuentra el incompatibles * .so archivos.

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

Rico
fuente
stackoverflow
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
relacionado: stackoverflow.com/questions/58654288/…
smwikipedia

Respuestas:

15

LDFLAGSdebería incluir -m32también. Lo siguiente debería funcionar:

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

De hecho, puede soltar -L/usr/lib32parte, ya que este es un directorio predeterminado para bibliotecas de 32 bits, y su sistema lo sabe.

Básicamente, la forma más sencilla de construir una aplicación de 32 bits en una máquina de 64 bits es:

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

..o alimente esas variables para configurar el script si está usando autotools.

ACTUALIZAR:

Parece que no está familiarizado con las diferencias en la vinculación con bibliotecas estáticas y dinámicas. Intentaré ser lo más mínimo posible:

  • Las bibliotecas de desarrollo estáticas y 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 postfix adicional, como para la versión libname.adinámica y libname_s.apara la versión estática.
  • Claro, las versiones de biblioteca estática y dinámica difieren en tamaño. La versión estática es más pesada.
  • Si vincula con la biblioteca estática, su aplicación no tiene dependencias. Si se vincula con la biblioteca dinámica, dependerá de la .sobiblioteca de tiempo de ejecución que debería 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 ().

Andrejs Cainikovs
fuente
Ahora creo que hay algo mal con mi configuración. Cada vez que agrego el -m32 en mi último comando gcc, busca en su lugar la carpeta / usr / lib. Si no agrego -m32, y uso el indicador -L / usr / lib32, busca el directorio correcto pero genera los errores anteriores. ¿Sabes qué puede causar esto?
Rico
¿Y qué sucederá si combina ambos (como en mi ejemplo anterior)?
Andrejs Cainikovs
si combino ambos, todavía no busca en / usr / lib32. solo busca en / usr / lib. Y por cierto, estoy usando herramientas automáticas.
Rico
Extraño ... ¿Intentaste alimentarlo en su -l/usr/lib32/libXaw.solugar?
Andrejs Cainikovs
No puede encontrarlos ...: gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: no se puede encontrar -l / usr / lib32 / libXaw.so
Rich
9

Estaba recibiendo errores como:

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

Esto me lo arregló:

sudo apt-get install g++-multilib

Si está utilizando un paquete gcc que no sea el predeterminado (por ejemplo gcc-7), deberá instalar el paquete para esa versión específica:

sudo apt-get install g++-7-multilib
Vladimir Panteleev
fuente
1
g++-multilibes para g ++ (C ++), para gcc (C) también necesita gcc-multilib.
Pevik