2010-06-25 17 views
25

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

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 Ubuntu de 64 bits y supongo que la versión del servidor se ejecuta en 32 bits. Sin embargo, después de ajustar mis variables de entorno para:

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 Haz tutorial?

== == Editar

Ésta era 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?

+1

¿Esa biblioteca es definitivamente de 32 bits? Pruebe 'file/dvlpmnt/libPI-Http.a' – Rup

+0

@Rup: es probable que diga 'archivo ar actual', que no es tremendamente útil. Tienes que obtener un archivo dentro del archivo, como se muestra en mi respuesta. –

+0

Por favor, publique la línea de comando del enlazador ... tiene razón, parece que la biblioteca es de 32 bits, pero tal vez el enlazador busque bibliotecas de 64 bits a pesar de lo que pensó que había hecho. –

Respuesta

28

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

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

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

  1. sólo para comprobar: por lo general deberá añadir banderas a CFLAGS en lugar de CTAGS - ¿está seguro de que esto es correcta? (Lo que tienes puede ser correcto, ¡esto dependerá de tu sistema de compilación!)
  2. A menudo, la bandera tiene que ser pasado al enlazador también - por lo que también puede que tenga que modificar LDFLAGS

Si eso no ayuda - ¿Se puede publicar la salida de error completo, además de la orden real (ej. gcc foo.c -m32 -Dxxx etc.) que se estaba ejecutando?

+1

Lo siento, tienes razón. Utilicé CFLAGS en lugar de CTAGS: P –

+0

Además de esta solución, puede agregar '-Wl, - no-warn-search-mismatch' a su' CFLAGS', por lo que estas advertencias quedan suprimidas. –

9

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 para el compilador/enlazador no es válido. El error ocurre cuando no se puede encontrar otra biblioteca con el contenido correcto.

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

Para establecer lo que es 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 'file' paso le indica qué tipo de archivos de objetos están en el archivo. El resto simplemente se asegura de que no se ensucie y no se pueda limpiar fácilmente.

+1

Eh, eso es extraño, este paso ahora me está mostrando que todas las bibliotecas en cuestión son, de hecho, de 32 bits. o__o –

+1

@defaultstring: ¿Cuál es la línea de comando de enlace real? ¿Incluye la bandera '-m32'? Agregue eso como información adicional en la pregunta, en lugar de como un comentario adicional aquí, por favor. –