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 / ?
Respuestas:
LDFLAGS
debería incluir-m32
también. Lo siguiente debería funcionar:De hecho, puede soltar
-L/usr/lib32
parte, 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:
..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:
.a
libname.a
dinámica ylibname_s.a
para la versión estática..so
biblioteca 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 ().
fuente
-l/usr/lib32/libXaw.so
lugar?Estaba recibiendo errores como:
Esto me lo arregló:
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:fuente
g++-multilib
es para g ++ (C ++), para gcc (C) también necesitagcc-multilib
.