2010-04-27 15 views
8

Estoy desarrollando un proyecto en VC++ 2008. El proyecto usa la biblioteca OpenCV (pero supongo que esto se aplica a cualquier otra biblioteca). Estoy trabajando con la configuración de depuración, las propiedades del enlazador incluyen las versiones de depuración de la biblioteca .lib como dependencias adicionales. En los directorios de VC++ en Herramientas | Opciones configuré el directorio de inclusión, el directorio .lib y los directorios de origen de la biblioteca también. Aparece un error al llamar a una de las funciones de la biblioteca y me gustaría ver exactamente qué está haciendo esa función. La línea que produce el error es:Cómo depurar una biblioteca externa (OpenCV) en Visual C++?

double error = cvStereoCalibrate(&calObjPointsM, &img1PointsM, &img2PointsM, 
&pointCountsM, 
&cam1M, &dist1M, &cam2M, &dist2M, imgSize, &rotM, &transM, NULL, NULL, 
cvTermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 100, 1e-5)); 

I fijó un punto de interrupción en esta línea para ver cómo falla la función cvStereoCalibrate(). Desafortunadamente, el depurador no mostrará el código fuente de esta función cuando pulso "Entrar". Se salta inmediatamente a cvTermCriteria() (que es una función simple en línea, macro-algo) y muestra su contenido. ¿Hay algo más que deba hacer para poder ingresar a las funciones de la biblioteca externa en el depurador?

EDIT: Creo que la función cvTermCriteria() se muestra en el depurador, porque está definida en un archivo de encabezado, por lo tanto, inmediatamente accesible para el proyecto.

Edit2: Los archivos .pdb faltaban para los archivos de la biblioteca, ahora recompilado la biblioteca OpenCV en Visual C++ en la configuración de depuración, existen los archivos .pdb, pero siguen siendo de alguna manera invisible para el depurador:

Cargado 'C: \ Users \ DarekSz \ Documents \ Visual Studio 2008 \ Projects \ libcci \ Debug \ ccisample.exe', Símbolos cargados.
'ccisample.exe': Cargado 'C: \ Windows \ SysWOW64 \ ntdll.dll'
'ccisample.exe': Cargado 'C: \ Windows \ SysWOW64 \ kernel32.dll'
'ccisample.exe': Cargado 'C: \ Windows \ SysWOW64 \ KernelBase.dll'
'ccisample.exe': Cargado 'C: \ OpenCV2.1 \ bin \ cv210d.dll'
'ccisample.exe': Cargado 'C: \ OpenCV2 .1 \ bin \ cxcore210d.dll '

Los símbolos no se cargan aparentemente para los dlls de opencv. Aún así, los archivos .pdb existen en el directorio \ bin.

+0

¿Se compiló el archivo DLL de OpenCV con información de depuración? – Mark

+0

He descargado la versión 2.1 OpenCV, la que está preparada especialmente para vC++ 2008, tiene librerías estáticas, normales y de depuración (por ejemplo, cxcore210.lib vs. cxcore210d.lib). Estoy usando el último. Supongo que podrían importar libs para un dll, pero no creo que sean ... – neuviemeporte

+1

Resulta que estoy usando dlls de libs de exportación en realidad. – neuviemeporte

Respuesta

12

Para resumir toda la actividad en los comentarios: la clave para la solución era reconstruir la biblioteca en VC++ para obtener los archivos .pdb (Base de datos de depuración de programa) para la depuración, las bibliotecas de sufijo precompiladas "-d" no suficiente.Aún así, las librerías de importación para los archivos dlls de la biblioteca hicieron que el programa cargara dlls precompilados del árbol de paquetes de OpenCV, no los de mi compilación con la información .pdb (las rutas eran similares, así que no me di cuenta al principio). La ruta a los archivos .pdb se proporcionó en Herramientas | Opciones, pero estos archivos no se cargaron porque la versión del módulo no coincide (obviamente). Una vez que copié los dlls correctos y sus respectivos archivos .pdb en el directorio de la aplicación, el depurador comenzó a funcionar dentro de las funciones de la biblioteca.

3

Confirmar: ¿está realmente compilando la biblioteca OpenCV desde el código fuente o solo está enlazando con ella?

Un par de posibilidades vienen a la mente:

Suena como la información de depuración para la biblioteca OpenCV no está disponible (los archivos PDB). Es posible que tenga que extender PATH para hacer referencia al directorio que contiene estos archivos. Me parece que hay una forma de hacerlo desde VC++, pero estoy a unos años de usar la herramienta ...

¿Es cvStererCalibrate también una "función macro"? Si es así, averigüe a qué función real se refiere y establezca el punto de interrupción en la biblioteca.

Finalmente, aunque ya lo haya dicho, nunca está de más volver y confirmar que la depuración completa se ha activado para todo el proyecto, incluidas las bibliotecas externas.

No sé si esto ayuda, pero es un buen lugar para comenzar.

+0

Acabo de vincular con librerías estáticas de opencv. No puedo ver los archivos .pdb en ningún lugar del árbol de la biblioteca. Pensé que los archivos lib-sufijo lib especiales ya incluyen toda la información necesaria. La función no es una macro, solo una función regular de estilo C. ¿Qué tipo de opción habilita la depuración de bibliotecas externas? – neuviemeporte

+0

A menos que las bibliotecas de extern se compilen con información de depuración de VC++, deberá recrear la biblioteca con VC++ y establecer todos los indicadores necesarios para utilizar la información de depuración. Intente crear un nuevo proyecto de lib estático de VC++ basado en el origen de OpenCV, compilarlo con la información de depuración completa y luego tener el enlace de proyecto contra la nueva biblioteca de OpenCV. – kmontgom

+0

Bien, lo intentaré. En cuanto a la diferencia entre la accesibilidad de las funciones cvTerm ... y cvStereo ..., supongo que se debe a que cvTerm está definido en un archivo de encabezado, no en el objeto lib. – neuviemeporte

2

i dieron los mismos problemas, que es:

'ccisample.exe': Cargado 'C: \ OpenCV2.1 \ bin \ cv210d.dll'

'ccisample.exe': Cargado ' C: \ OpenCV2.1 \ bin \ cxcore210d.dll '

lo resuelto por:

Enlazador -> entrada -> dependencias adicionales añaden:' cv210.lib; cxcore210.lib; highgui210.lib; '

en lugar de agregar: 'cv210d.lib; cxcore210d.lib; highgui210d.lib; '

Cuestiones relacionadas