2010-02-07 11 views
6

Tengo un proyecto que está trabajando con FreeImage y openCV, actualmente estamos usando el soporte jpeg de ambos (estoy trabajando para solucionarlo, pero por ahora debe quedarse). De todos modos, FreeImage compila libjpeg 7.0 en sus bibliotecas estáticas, y la biblioteca highgui de openCV lo vincula como una biblioteca compartida (en mi sistema, Ubuntu 9, tengo libjpeg 6.2 instalado).Conflictos de símbolos de bibliotecas estáticas y compartidas?

Se vinculan a una biblioteca final que se utiliza para vincular a varios programas, envoltorios Java, etc. Todo eso funciona bien, no hay conflictos de símbolos ni nada durante el tiempo de compilación/enlace. Sin embargo, cuando voy a abrir una imagen usando la función openCV cvLoadImage, muere al leer el encabezado, muy probablemente debido a diferencias entre los encabezados en 6.2 y 7.0.

Si desvincula FreeImage (y comenta el código que lo requiere), las llamadas openCV comienzan a funcionar nuevamente, por lo que los símbolos libjpeg estáticos de FreeImage están en conflicto con los símbolos que se cargarían desde la biblioteca compartida libjpeg. Lo que no puedo entender es por qué mi compilador no está arrojando un error durante la vinculación debido a los dos conjuntos de símbolos libjpeg. Además, he intentado reemplazar el encabezado jpeglib.h de mi sistema con la versión 7.0 temporalmente para ver si openCV compilado con eso se sincronizaría con los símbolos que Freeimage trae a la mesa, en vano parece.

Por último puse un printf en jpeg_read_header en el libjpeg que compila freeimage, y lo reconstruí para ver si openCV está usando la definición libjpeg de Freeimage. No se imprimió así que tengo que asumir que no.

así que supongo que mis preguntas son

1) ¿Por qué no vincular un libjpeg estática y una libjpeg compartida generan errores que unen debido a la duplicación símbolos?

2) ¿Alguien sabe por qué estas dos cosas están en conflicto entre sí?

Editar: La compilación de openCV en modo de depuración y luego en el modo regular de nuevo parece haber dejado algo suelto y lo hizo funcionar de nuevo, ni idea de lo que está pasando.

Respuesta

1

es así

bibliotecas estáticas están recopilados en, bibliotecas dinámicas se cargan en tiempo de ejecución, pero sólo aquellos símbolos que faltan (creo). puede compilar bibliotecas compartidas, y entonces probablemente obtenga una colisión de símbolos.

por lo que opencv utiliza símbolos que están compilados, ya que ya están presentes, en lugar de los de bibliotecas dinámicas. terminas usando símbolos estáticos, posiblemente con diferentes firmas, desde prospectivo de opencv.

+0

Mi suposición es que está usando una u otra biblioteca, ¿pero quizás está usando un poco de ambas de alguna manera? Cambiar el encabezado con el que openCV compila no solucionó el problema después de todo ... –

1

En general, el vinculador está bien para que se pasen múltiples bibliotecas que resuelvan el mismo símbolo (s). Simplemente usa el primero que encuentra. El orden de las bibliotecas en su línea de comando del enlazador determinará cuál de ellas "gana".

Esto, por cierto, NO es cierto para los archivos de objeto. Cada linker que he usado asume que quiere para usar todos los objetos que especifique, y se quejará si más de uno tiene el mismo símbolo.

+0

Así que lo más probable es que sea una u otra versión de libjpeg la que "gane" ¿no? Así que o bien escogería la versión de openCV, en cuyo caso las cosas funcionarían, o cambiaría el encabezado que usa openCV durante la compilación para la imagen libre uno debería arreglarlo ... pero no es = ( –

+0

si el que el enlazador eligió fue diferente al encabezado que usaste, entonces esperaría que no funcione. Tendrás que cambiar los encabezados _y también_ reordenar las bibliotecas en la línea del enlace, e incluso eso es cortejar la falla. Es mejor dejar la lib que no quieres. utilizar fuera de la línea de enlace por completo –

Cuestiones relacionadas