Libreria no reconocida por python al hacer interfaz con c

Imagen de edwinreyes
0 puntos

Hola, me ha parecido muy bueno el desarrollo de este foro. Estoy intentando hacer una interfaz entre python y C con ctypes y resulta no reconocer un comando. Se puede presumir que el comando es propio de las librerias utilizadas, ya que al utilizar estas instrucciones en un programa en C, compilarlo y correrlo desde la terminal funciona perfectamente. Quiciera saber como lograr hacer esta interfaz. He seguido el siguiente procedimiento:

Compilar el programa en C

root@edwin-laptop:/home/edwin# gcc -fPIC -c `pkg-config --libs --cflags opencv` captureCam.c
root@edwin-laptop:/home/edwin# chmod +s captureCam.o
root@edwin-laptop:/home/edwin# ld -shared -soname libtest.so.1 -o libtest.so.1.0 -lc captureCam.o
root@edwin-laptop:/home/edwin# chmod +s libtest.so.1.0

Enlazar el archivo generado desde python, aca es donde se genera el error

>> from ctypes import *
>>> libtest = cdll.LoadLibrary('./libtest.so.1.0')
Traceback (most recent call last):
File "", line 1, in
libtest = cdll.LoadLibrary('./libtest.so.1.0')
File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__
self._handle = _dlopen(self._name, mode)
OSError: ./libtest.so.1.0: undefined symbol: cvGrabFrame
>>>

Este error no se genera si se compila y ejecuta desde la terminal, anexo el codigo en C a continuacion

#include
#include
#include
#include
#include
#include

void _init()
{
printf("Initialization of shared object\n");
}
void _fini()
{
printf("Clean-up of shared object\n");
}

IplImage* captureCam(/*int argc char ** argv*/)
{
//declaration block
IplImage * block1_img_o1 = NULL;
IplImage * block5_img_i1 = NULL;
IplImage * block5_img_o1 = NULL;

//execution block
//Weight: 1
CvCapture* block1_capture = NULL;
IplImage* block1_frame = NULL;
block1_capture = cvCaptureFromCAM(0);
if( !cvGrabFrame( block1_capture )
) { printf("Cannot Grab Image from camera 0"); }block1_frame = cvRetrieveFrame( block1_capture ); if( !cvGrabFrame( block1_capture )
) { printf("Cannot Grab Image from camera 0"); }block1_frame = cvRetrieveFrame( block1_capture ); if( !cvGrabFrame( block1_capture )
) { printf("Cannot Grab Image from camera 0"); }block1_frame = cvRetrieveFrame( block1_capture ); block1_img_o1 = cvCloneImage( block1_frame );
block5_img_i1 = cvCloneImage(block1_img_o1);// IMAGE conection
//Weight: 2

if(block5_img_i1){
block5_img_o1 = cvCloneImage(block5_img_i1);
cvSaveImage("CamEdwin.png" ,block5_img_i1);}

//deallocation block
cvReleaseImage(&block1_img_o1);
cvReleaseImage(&block5_img_o1);
cvReleaseImage(&block5_img_i1);

return block5_img_i1;
} //closing main()