c++ 64bit compilation 32-bit conflicting-libraries

c++ - Saltar bibliotecas incompatibles en compilar



64bit compilation (2)

Cuando intento compilar una copia de mi proyecto en mi máquina local, aparece un error que indica que se está saltando bibliotecas incompatibles. Este no es el caso cuando estoy jugando con la versión en vivo alojada en el servidor en el trabajo [se hace perfectamente allí].

Varios otros sitios me han llevado a creer que esto podría ser un problema de entorno, ya que estoy desarrollando una distribución de 64 bits de Ubuntu y asumo que la versión del servidor se ejecuta en 32 bits. Sin embargo, después de configurar mis variables de entorno a:

CFLAGS+=" -m32" CXXFLAGS+=" -m32"

Todavía recibo el mismo error de compilación de:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http

¿Puede un tutorial?

== Editar ==

Esta fue la salida que recibí cuando seguí el consejo de Jonathan:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

Al parecer, la biblioteca en cuestión es de 32 bits después de todo?


Ese mensaje no es realmente un error, es solo una advertencia de que el archivo en cuestión no es de la arquitectura correcta (por ejemplo, 32 bits frente a 64 bits, arquitectura de CPU incorrecta). El enlazador seguirá buscando una biblioteca del tipo correcto.

Por supuesto, si también can''t find lPI-Http un error en la línea de can''t find lPI-Http entonces tiene un problema :-)

Es difícil sugerir cuál será el remedio exacto sin conocer los detalles de su sistema de compilación y archivos make, pero aquí hay un par de disparos en la oscuridad:

  1. Solo para verificar: por lo general, agregaría banderas a CFLAGS lugar de a CTAGS . ¿Está seguro de que esto es correcto? (Lo que tienes puede ser correcto - ¡esto dependerá de tu sistema de compilación!)
  2. A menudo, la bandera también debe pasarse al vinculador, por lo que es posible que también deba modificar LDFLAGS

Si eso no ayuda, ¿puede publicar la salida de error completa, más el comando real (por ejemplo, gcc foo.c -m32 -Dxxx etc.) que se estaba ejecutando?


Normalmente, eso no es un error per se; es una advertencia de que el primer archivo que encontró que coincide con el argumento -lPI-Http con el compilador / enlazador no es válido. El error se produce cuando no se puede encontrar ninguna otra biblioteca con el contenido correcto.

Por lo tanto, debe ver si /dvlpmnt/libPI-Http.a es una biblioteca de archivos de objetos de 32 bits o de archivos de objetos de 64 bits; es probable que sea de 64 bits si está compilando con la opción -m32 . Luego debe establecer si existe un libPI-Http.a alternativo libPI-Http.a o libPI-Http.so en otro lugar que sea de 32 bits. Si es así, asegúrese de que el directorio que lo contiene esté listado en un argumento -L/some/where al vinculador. De lo contrario, deberá obtener o compilar una versión de la biblioteca de 32 bits desde algún lugar.

Para establecer lo que hay en esa biblioteca, es posible que tenga que hacer:

mkdir junk cd junk ar x /dvlpmnt/libPI-Http.a file *.o cd .. rm -fr junk

El paso '' file '' le dice qué tipo de archivos de objeto están en el archivo. El resto solo se asegura de no hacer un desastre que no se pueda limpiar fácilmente.