miércoles, 31 de octubre de 2012

Errores de compilación en Ubuntu 12.04

Antes de ayer me informaron que el código del guardado de imágenes capturadas por la webcam no compilaba en Ubuntu 12.04.

Como en un principio el mensaje daba a entender que era problema de no tener instaladas las librerías (por el típico error "undefined reference") recomendé instalar todo lo relacionado con opencv-dev que se me vino a la cabeza que debería necesitar:

redstar@redstar-virtual-machine:~$ sudo apt-get install libcv-dev libhighgui-dev libopencv-contrib-dev

El problema persistía, por lo que para probar y arreglar el problema (a mí me funcionaba en máquinas Debian 5, 6 y Ubuntu 10.04) me instalé una máquina virtual y comprobé que realmente daba problemas el método de compilación propuesto en mi código:

redstar@redstar-virtual-machine:~$ gcc `pkg-config --libs --cflags opencv` -o webcam_jpeg webcam_jpeg.c
/tmp/cchQFB8g.o: In function `cvRound':
webcam_jpeg.c:(.text+0x19): undefined reference to `lrint'
/tmp/cchQFB8g.o: In function `cvDecRefData':
webcam_jpeg.c:(.text+0xa5a): undefined reference to `cvFree_'
webcam_jpeg.c:(.text+0xacb): undefined reference to `cvFree_'
/tmp/cchQFB8g.o: In function `cvGetRow':
webcam_jpeg.c:(.text+0xbc1): undefined reference to `cvGetRows'
/tmp/cchQFB8g.o: In function `cvGetCol':
webcam_jpeg.c:(.text+0xbec): undefined reference to `cvGetCols'
/tmp/cchQFB8g.o: In function `cvReleaseMatND':
webcam_jpeg.c:(.text+0xbff): undefined reference to `cvReleaseMat'
/tmp/cchQFB8g.o: In function `cvSubS':
webcam_jpeg.c:(.text+0xd1f): undefined reference to `cvAddS'
/tmp/cchQFB8g.o: In function `cvCloneSeq':
webcam_jpeg.c:(.text+0xd6d): undefined reference to `cvSeqSlice'
/tmp/cchQFB8g.o: In function `cvSetNew':
webcam_jpeg.c:(.text+0xdcc): undefined reference to `cvSetAdd'
/tmp/cchQFB8g.o: In function `cvGetSetElem':
webcam_jpeg.c:(.text+0xe5f): undefined reference to `cvGetSeqElem'
/tmp/cchQFB8g.o: In function `cvEllipseBox':
webcam_jpeg.c:(.text+0xf5f): undefined reference to `cvEllipse'
/tmp/cchQFB8g.o: In function `cvFont':
webcam_jpeg.c:(.text+0xfaf): undefined reference to `cvInitFont'
/tmp/cchQFB8g.o: In function `cvReadIntByName':
webcam_jpeg.c:(.text+0x103d): undefined reference to `cvGetFileNodeByName'
/tmp/cchQFB8g.o: In function `cvReadRealByName':
webcam_jpeg.c:(.text+0x10ce): undefined reference to `cvGetFileNodeByName'
/tmp/cchQFB8g.o: In function `cvReadStringByName':
webcam_jpeg.c:(.text+0x1128): undefined reference to `cvGetFileNodeByName'
/tmp/cchQFB8g.o: In function `cvReadByName':
webcam_jpeg.c:(.text+0x1158): undefined reference to `cvGetFileNodeByName'
webcam_jpeg.c:(.text+0x116e): undefined reference to `cvRead'
/tmp/cchQFB8g.o: In function `cvCreateSubdivDelaunay2D':
webcam_jpeg.c:(.text+0x11a1): undefined reference to `cvCreateSubdiv2D'
webcam_jpeg.c:(.text+0x11cb): undefined reference to `cvInitSubdivDelaunay2D'
/tmp/cchQFB8g.o: In function `cvContourPerimeter':
webcam_jpeg.c:(.text+0x12ff): undefined reference to `cvArcLength'
/tmp/cchQFB8g.o: In function `cvCalcHist':
webcam_jpeg.c:(.text+0x1327): undefined reference to `cvCalcArrHist'
/tmp/cchQFB8g.o: In function `main':
webcam_jpeg.c:(.text+0x1558): undefined reference to `cvCreateCameraCapture'
webcam_jpeg.c:(.text+0x15bf): undefined reference to `cvQueryFrame'
webcam_jpeg.c:(.text+0x1608): undefined reference to `cvSaveImage'
webcam_jpeg.c:(.text+0x1614): undefined reference to `cvWaitKey'
webcam_jpeg.c:(.text+0x163e): undefined reference to `cvDestroyWindow'
webcam_jpeg.c:(.text+0x164a): undefined reference to `cvReleaseCapture'
collect2: ld devolvió el estado de salida 1

Para arreglarlo simplemente hay que cambiar el orden de los parámetros y poner como primer parámetro el archivo del programa C que se desea compilar, acto seguido qué archivo ejecutable será generado y por último la referencia a los parámetros necesarios para usar includes y librerías de OpenCV:

redstar@redstar-virtual-machine:~$ gcc webcam_jpeg.c -o webcam_jpeg `pkg-config --libs --cflags opencv`

Así que he aprovechado y he cambiado TODAS la cabeceras de mis aplicaciones publicadas en este blog para que estén en el orden correcto.

Si alguien conoce el motivo exacto por el que ha dejado de funcionar el método que usaba anteriormente agradecería que me lo hiciera saber, siempre he sido curioso y me gusta saber el porqué de las cosas y no aceptarlas porque sí.

No hay comentarios:

Publicar un comentario