OpenCV程序在Debug时出现「PDB文件无法加载」的一个解决方法
2015-02-07 16:45
411 查看
这几天毕设要用到OpenCV,按照网上的教程来搭建开发环境。
用的是OpenCV 3.0 beta + Visual Studio Community 2013。我的系统64位是Win 8.1,但在加载环境变量和包含库的时候都选了32位的,因为64对32兼容所以这没有问题。后文中的Debug也是x32的。
搭建开发环境参考了Youtube上OpenCV Moment的教学视频(奇怪的俄式英语…):传送门
切入正题
完成搭建后,采用以下代码测试:
我所遇到的问题是,编译通过,但无法Debug,无法单步调试。尝试Debug的时候会提示一堆 .dll 文件的 .pdb 文件找不到。
稍微了解了一下 .pdb 文件。它是 .dll 文件在编译过程中产生的符号文件,举个例子解释一下它的作用(当然啦基于我个人的片面理解):
我有一个工程A需要Debug,在A工程中我调用了B.dll。如果在调试中我想通过单步调试进入B.dll中的函数,我就必须要有B在编译时产生的符号文件,即B.pdb。通常将 .pdb 文件和对应的 .dll 文件放在同一目录下。
也就是说,我只要为那些 dll 文件提供 pdb 文件就行了。可是上哪儿去找呢?
(简单暴力请直接跳到3)
1. 对于系统自带的dll :
VS的 [Tools]->[Options]->[Debugging]->[General]
勾选Enable source server support 选项
然后 [Tools]->[Options]->[Debugging]->[Symbols]
勾选那个Microsoft Symbol Server,然后确定
OK!下次Debug的时候,VS会自动从巨硬的服务器上下载 pdb 文件,第一次可能会比较慢。
2. 对于OpenCV的dll:
不要用build好的库,OpenCV是开源的,用官网提供的源码自己build吧。注意的是,用CMake生成工程文件的时候,有两次configure,第一次configure完之后,一定一定要在那些红框中,选定你需要的东西,再进行第二次configure。尤其是 world 和 ts 这两个 dll ,它们在默认配置中没有被勾选(明明它们是最重要的…)。编译好之后,就用自己的build来代替官方的build吧。自己build出来的有完整的pdb文件。
3. 对于奇奇怪怪的dll
我在Debug的时候,VS自动调用了一些奇怪的dll,我仔细看了一下,有4个跟我的显卡有关:
nvinit.dll, detoured.dll, Nvd3d9wrap.dll, nvdxgiwrap.dll
应该是Nvidia显卡的…我也不知道。于是我上Stackoverflow上问了一下:传送门(渣英文)
总之我最后的解决方法就是在 1 中的第4步多做一件事情,勾选Only specified modules选项…like this:
这样VS就不会在Debug的时候加载一些奇奇怪怪的dll(包括前两步提到的dll)的pdb了…反正我们在单步调试的时候,也不需要进入到它们的函数里。
如此一来就能愉快地Debug了,顺便一提,OpenCV官方提供的VS插件 「Image Watch」 真的很好用。
用的是OpenCV 3.0 beta + Visual Studio Community 2013。我的系统64位是Win 8.1,但在加载环境变量和包含库的时候都选了32位的,因为64对32兼容所以这没有问题。后文中的Debug也是x32的。
搭建开发环境参考了Youtube上OpenCV Moment的教学视频(奇怪的俄式英语…):传送门
切入正题
完成搭建后,采用以下代码测试:
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main(int argc, char **argv) { Mat img = imread("G:\\afk.jpg"); //测试的时候最好写上图片的绝对路径,以避免一些错误。 if (img.empty()) { cout << "打开图像失败!" << endl; return -1; } namedWindow("test", WINDOW_AUTOSIZE); //需要注意的是,很多老版本的OpenCV教程都会把上面的第二个参数写成:CV_WINDOW_AUTOSIZE,这里用的是OpenCV 3.0 beta,前面加CV_的写法已经过时了。 imshow("test", img); waitKey(); return 0; }
我所遇到的问题是,编译通过,但无法Debug,无法单步调试。尝试Debug的时候会提示一堆 .dll 文件的 .pdb 文件找不到。
稍微了解了一下 .pdb 文件。它是 .dll 文件在编译过程中产生的符号文件,举个例子解释一下它的作用(当然啦基于我个人的片面理解):
我有一个工程A需要Debug,在A工程中我调用了B.dll。如果在调试中我想通过单步调试进入B.dll中的函数,我就必须要有B在编译时产生的符号文件,即B.pdb。通常将 .pdb 文件和对应的 .dll 文件放在同一目录下。
也就是说,我只要为那些 dll 文件提供 pdb 文件就行了。可是上哪儿去找呢?
(简单暴力请直接跳到3)
1. 对于系统自带的dll :
VS的 [Tools]->[Options]->[Debugging]->[General]
勾选Enable source server support 选项
然后 [Tools]->[Options]->[Debugging]->[Symbols]
勾选那个Microsoft Symbol Server,然后确定
OK!下次Debug的时候,VS会自动从巨硬的服务器上下载 pdb 文件,第一次可能会比较慢。
2. 对于OpenCV的dll:
不要用build好的库,OpenCV是开源的,用官网提供的源码自己build吧。注意的是,用CMake生成工程文件的时候,有两次configure,第一次configure完之后,一定一定要在那些红框中,选定你需要的东西,再进行第二次configure。尤其是 world 和 ts 这两个 dll ,它们在默认配置中没有被勾选(明明它们是最重要的…)。编译好之后,就用自己的build来代替官方的build吧。自己build出来的有完整的pdb文件。
3. 对于奇奇怪怪的dll
我在Debug的时候,VS自动调用了一些奇怪的dll,我仔细看了一下,有4个跟我的显卡有关:
nvinit.dll, detoured.dll, Nvd3d9wrap.dll, nvdxgiwrap.dll
应该是Nvidia显卡的…我也不知道。于是我上Stackoverflow上问了一下:传送门(渣英文)
总之我最后的解决方法就是在 1 中的第4步多做一件事情,勾选Only specified modules选项…like this:
这样VS就不会在Debug的时候加载一些奇奇怪怪的dll(包括前两步提到的dll)的pdb了…反正我们在单步调试的时候,也不需要进入到它们的函数里。
如此一来就能愉快地Debug了,顺便一提,OpenCV官方提供的VS插件 「Image Watch」 真的很好用。
相关文章推荐
- IIS7出现未能加载文件或程序集“XXX.XXX”或它的某一个依赖项。试图加载格式不正确的程序的解决方法
- OpenCV:Visual Studio2013 出现"无法查找或打开PDB文件"解决方法
- IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法
- IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法
- 未能解决:未能加载文件或程序集“XXXXXXXXX”或它的某一个依赖项。另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x8007002
- VS2010运行opencv的程序,出现“应用程序无法正常启动0xc000007b”的解决方法
- 用VS2010自带的Library Package Manager安装EFCodeFirst出现“无法加载一个或多个请求的类型”错误的解决方法
- 解决SQL2000出现"无法执行查询,因为文件缺少或未注册。再次运行安装程序确保要求的文件已注册。"的方法
- VS2013配置OpenCV2.4.9出现fatal error LNK1104:无法打开文件kernel32.lib的解决方法
- 使用Tessnet2_32.dll报未能加载文件或程序集或它的某一个依赖项。试图加载格式不正确的程序解决方法
- vs2013或2012运行c语言出现:无法查找或打开 PDB 文件,解决方法
- 关于使用EmguCV出现 “无法加载 DLL“cvextern”: 找不到指定的程序” 的解决方法
- OpenCV:Visual Studio "无法查找或打开PDB文件"解决方法
- IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法
- 在WIN10系统下运行VS2013编译成功后出现:无法启动程序“.exe” 系统找不到指定文件的问题的解决方法
- OpenCV配置后debug出现问题(应用程序无法正常启动)的解决方法!!!
- IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法
- VS2010配置OpenCV2.4.7出现fatal error LNK1104:无法打开文件kernel32.lib的解决方法
- cmd命令行执行java程序的编译和执行的方法及可能出现找不到或无法加载主类的错误的解决
- vs2013无法加载PDB文件解决方法