这几天毕设要用到OpenCV,按照网上的教程来搭建开发环境。

用的是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

  1. VS的 [Tools]->[Options]->[Debugging]->[General]
  2. 勾选Enable source server support 选项
  3. 然后 [Tools]->[Options]->[Debugging]->[Symbols]
  4. 勾选那个Microsoft Symbol Server,然后确定

    OK!下次Debug的时候,VS会自动从巨硬的服务器上下载 pdb 文件,第一次可能会比较慢。

2. 对于OpenCV的dll

不要用build好的库,OpenCV是开源的,用官网提供的源码自己build吧。注意的是,用CMake生成工程文件的时候,有两次configure,第一次configure完之后,一定一定要在那些红框中,选定你需要的东西,再进行第二次configure。尤其是 worldts 这两个 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程序在Debug时出现「PDB文件无法加载」的一个解决方法的更多相关文章

  1. Eclipse运行时无法加载主类的解决方法

    测试代码: package javastudy; class Person { public static void main(String[] args) { PersonCeshi pp=new ...

  2. cmd下运行java文件时,找不到或无法加载主类的解决方法

    最近再看java,却被一个看似很基础的hellorworld头疼了十几分钟,百度了一下,若你在cmd下编辑及运行.java文件时报错,解决方案如下,如图所示:

  3. Ubuntu中程序部署时无法加载动态库的解决方法

    Ubuntu下修改环境变量的三种方法 添加环境变量无法解决,可尝试如下操作: sudo vim /etc/ld.so.conf 在ld.so.conf中加入动态库的目录... 然后 sudo ldco ...

  4. VS调试时JSON格式文件无法加载

    VS调试时JSON格式文件无法加载 报错: 解决:在项目中的web.config中进行配置,configuration节中添加以下部份: <system.webServer> <st ...

  5. 2016-07-07: 重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件

    使用VS2008在一个解决方案中包含多个项目时,当设置多个项目的中间目录为同一个目录时,在增量编译时出现"重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件,请重新创建预编译头问 ...

  6. 微信小程序开发之 下拉刷新,上拉加载更多

    本文记载了如何在微信小程序里面实现下拉刷新,上拉加载更多 先开看一下界面 大致如此的界面吧. 这个Demo使用了微信的几个Api和事件,我先列出来. 1.wx.request (获取远程服务器的数据, ...

  7. Django项目关闭debug模式后,静态文件无法加载的解决办法

    开启内置服务器,由于项目中local_settings.py文件中的DEBUG=True,进行开发和调试一直没什么问题. 但是现在需要编写404,500等出错页面,在debug模式下出了错都会出现报错 ...

  8. 简易数据分析 10 | Web Scraper 翻页——抓取「滚动加载」类型网页

    这是简易数据分析系列的第 10 篇文章. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『刷』字,因为看动态的时候,当把内容拉到屏 ...

  9. 大量客户反映wordpress的网站打开巨慢,经分析发现,这些网站大都使用了google的字体服务,由于最近google的服务已经被大陆屏蔽,所以wordpress的网站打开时,会卡在字体加载上。

     一会你安装完wp,发现打开巨卡的话,看看这个帖子:http://bbs.myhostcn.com/thread-1026-1-1.html最近一段时间,大量客户反映wordpress的网站打开巨慢, ...

随机推荐

  1. boost xpressive 例子

    1.效果图: 我有一个wordpress博客,每次在csdn上写完博客,都需要复制到wordpress中,还需要手动修改<pre>和图片地址,比较麻烦,所以做了这个工具. 功能: 1.把C ...

  2. hdu1263 水果(结构体排序)

    Problem Description 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样J ...

  3. [Go语言学习]之一:搭建单元测试环境

    最近开始正式的学习Go语言,奉行我学习一项新技术的步骤和原则( 笔记 + 单元测试 + demo ).首先学习了开发环境的配置,并立即搭建了单元测试的环境,这样可以一边写笔记,一边进行测试和学习,从而 ...

  4. CPU内存管理和linux内存分页机制

    一.概念 物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应.——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理 ...

  5. 机器学习( Machine Learning)的定义

    关于机器学习有两个相关的定义: 1)给计算机赋予没有固定编程的学习能力的研究领域. 2)一种计算机的程序,能从一些任务(T)和性能的度量(P),经验(E)中进行学习.在学习中,任务T的性能P能够随着P ...

  6. 爬虫关于ip管理池的应用

    在爬虫的时候经常会遇到一个问题就是ip被封,由于ip对网站的短时间大量请求,让网站将我们的ip暂时封掉.这样我们就无法全部爬取自己想要的内容. 这里百度了一下解决办法,很多人都提到了ip代理管理池的问 ...

  7. windows全系列激活脚本-改良版.cmd

    @ECHO OFFTITLE Windows 全版本系统激活cscript //nologo %Systemroot%\system32\slmgr.vbs -skms 10.1.1.12ECHO 检 ...

  8. Python学习--09 模块

    模块让我们能够有逻辑地组织Python代码段.把相关的代码分配到一个 模块里能让我们的代码更好用,更易懂. 导入模块 Python使用import语句导入模块.语法: # 形式一:导入模块 impor ...

  9. [HMLY]10.iOS中block的基础用法

    本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道 ...

  10. jmeter(八)-JDBC请求(sqlserver)

    做JDBC请求,首先要了解这个JDBC对象是什么,然后寻找响应的数据库连接URL和数据库驱动. 数据库URL:jdbc:sqlserver://200.99.197.190:1433;database ...