如何在Visual C ++中调试外部库(OpenCV)?

时间:2010-04-27 12:04:09

标签: debugging visual-c++ opencv

我正在VC ++ 2008中开发一个项目。该项目使用OpenCV库(但我想这适用于任何其他库)。我正在使用Debug配置,链接器属性包括库.lib的调试版本作为附加依赖项。在Tools | Options下的VC ++目录中,我设置了include目录,.lib目录,以及库的源目录。我在调用库中的一个函数时遇到错误,我想确切地看到该函数正在做什么。产生错误的行是:

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));

我在这一行设置了一个断点,看看cvStereoCalibrate()函数是如何失败的。不幸的是,当我点击“Step into”时,调试器不会显示此函数的源代码。它会立即跳转到cvTermCriteria()(这是一个简单的内联,宏类型函数)并显示其内容。为了能够在调试器中输入外部库函数,我还需要做些什么吗?

编辑:我认为cvTermCriteria()函数在调试器中显示,因为它在头文件中定义,因此可以立即访问项目。

EDIT2:库文件缺少.pdb文件,现在我在Debug配置中重新编译了Visual C ++中的OpenCV库,.pdb文件存在,但调试器仍然不知道:

  

已加载'C:\ Users \ DarekSz \ Documents \ Visual Studio 2008 \ Projects \ libcci \ Debug \ ccisample.exe',已加载符号。
  'ccisample.exe':已加载'C:\ Windows \ SysWOW64 \ ntdll.dll'   'ccisample.exe':已加载'C:\ Windows \ SysWOW64 \ kernel32.dll'   'ccisample.exe':已加载'C:\ Windows \ SysWOW64 \ KernelBase.dll'   'ccisample.exe':已加载'C:\ OpenCV2.1 \ bin \ cv210d.dll'   'ccisample.exe':已加载'C:\ OpenCV2.1 \ bin \ cxcore210d.dll'

opencv dll显然没有加载符号。仍然,.pdb文件存在于\ bin目录中。

3 个答案:

答案 0 :(得分:12)

总结注释中的所有活动:解决方案的关键是在VC ++中重建库以获取用于调试的.pdb(程序调试数据库)文件,预编译的“-d”后缀库不是足够。仍然,库dll的导入库使程序从OpenCV包树加载预编译的dll,而不是我的构建中带有.pdb信息的那些(路径类似,所以我最初没有注意到)。工具|选项中提供了.pdb文件的路径,但由于模块版本不匹配(显然),因此未加载这些文件。一旦我将正确的dll及其各自的.pdb文件复制到应用程序目录,调试器就开始在库函数内部工作。

答案 1 :(得分:3)

确认:你实际上是从源代码编译OpenCV库,还是只是链接它?

有几种可能性浮现在脑海中:

听起来OpenCV库的调试信息不​​可用(PDB文件)。您可能必须扩展PATH以引用包含这些文件的目录。在我看来,有一种方法可以从VC ++中做到这一点,但是我使用该工具已经有几年...

cvStererCalibrate也是“宏功能”吗?如果是这样,找出它引用的实际函数并在库中设置断点。

最后,虽然您已经这样说过了,但回过头来确认已经为项目中的所有内容(包括外部库)激活了完整的调试,这绝不会让人痛苦。

我不知道这是否有帮助,但它是一个很好的起点。

答案 2 :(得分:2)

我遇到了同样的问题,这是:

'ccisample.exe':已加载'C:\ OpenCV2.1 \ bin \ cv210d.dll'

'ccisample.exe':已加载'C:\ OpenCV2.1 \ bin \ cxcore210d.dll'

我解决了它:

链接器 - >输入 - >附加依赖项添加:'cv210.lib; cxcore210.lib; highgui210.lib;'

而不是添加:'cv210d.lib; cxcore210d.lib; highgui210d.lib;”