【问题标题】:How to debug an external library (OpenCV) in Visual C++?如何在 Visual C++ 中调试外部库(OpenCV)?
【发布时间】:2014-05-15 11:05:02
【问题描述】:

我正在用 VC++2008 开发一个项目。该项目使用 OpenCV 库(但我想这适用于任何其他库)。我正在使用调试配置,链接器属性包括库 .lib 的调试版本作为附加依赖项。在工具|选项下的 VC++ 目录中,我设置了包含目录、.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 文件,现在我在调试配置中重新编译 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 目录中。

【问题讨论】:

  • OpenCV dll 是否使用调试信息编译?
  • 我下载了OpenCV 2.1版本,是专门为vc++2008准备的,它有静态库、普通库和调试库(例如cxcore210.lib vs. cxcore210d.lib) .我正在使用后者。我想它们可能是 dll 的导入库,但我不认为它们是......
  • 原来我实际上使用的是导出库中的 dll。

标签: debugging visual-c++ opencv


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    我想到了几种可能性:

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

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

    最后,虽然您已经说过了,但返回并确认已为项目中的所有内容(包括外部库)激活了完整的调试也没有什么坏处。

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

    【讨论】:

    • 我只是链接到静态 opencv 库。我在库树的任何地方都看不到 .pdb 文件。我认为特殊的 -d 后缀 lib 文件已经包含所有必要的信息。该函数不是宏,只是一个常规的 C 风格函数。什么样的选项可以调试外部库?
    • 除非外部库是使用 VC++ 调试信息编译的,否则您必须使用 VC++ 实际重新创建库,并设置使用调试信息所需的所有标志。尝试基于 OpenCV 源创建一个新的 VC++ 静态库项目,使用完整的调试信息对其进行编译,然后将您的项目链接到新的 OpenCV 库。
    • 好的,我试试。关于 cvTerm... 和 cvStereo... 函数的可访问性之间的区别,我猜是因为 cvTerm 是在头文件中定义的,而不是在 lib 对象中。
    • 问题是:cvStereo... 也是#define 的东西吗?无论如何,#define 的“函数”必须由真实代码支持。
    • 附带说明,您还应该查看网页右侧的“相关”项目。似乎其中一些可能与您的问题有关....(例如stackoverflow.com/questions/1672273/…
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2013-09-07
      • 2021-02-26
      相关资源
      最近更新 更多