> ## Content Index
> Fetch the complete content index at: https://yinguobing.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# Debug OpenCV
- URL: https://yinguobing.com/blog/debug-opencv/
- Published: 2016-10-25T07:35:00.000Z
- Updated: 2022-05-29T07:55:25.000Z
- Description: 这篇文章简要介绍了如何在Linux环境下搭建OpenCV的Debug环境。完成后，您就可以在Eclipse中单步调试程序，查看变量数值、跟踪代码流转细节。
- Author: 尹国冰
- Tags: OpenCV

OpenCV是一款开源计算机视觉库。诞生于Intel公司的研究中心，成熟于Intel俄罗斯软件团队[\[1\]](#fn1)。它可以应用在摄像机标定、深度信息感知、模式识别、机器学习等领域。OpenCV采用C/C++来实现，可以在不同的平台下运行（包括Android与iOS），是学习图像处理，机器视觉不可多得的优秀样本。

这篇文章简要介绍了如何在Linux环境下搭建OpenCV的Debug环境。完成后，您就可以在Eclipse中单步调试程序，查看变量数值、跟踪代码流转细节。

所有工作会分两部分：

1. 编译OpenCV的Debug静态库；
2. 在Eclipse项目中正确配置编译与链接参数。

```
*准备工作*

OpenCV的Debug是在如下环境下实现的，供您参考。

* 操作系统：Ubuntu 16.04
* OpenCV: 3.1.0
* gcc: 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2) 
* cmake: 3.5.1
* Eclipse IDE for C/C++ Developers: Neon Release (4.6.0)

```

---

## 编译OpenCV (Debug)

OpenCV的[官方编译教程](http://docs.opencv.org/3.1.0/d7/d9f/tutorial%5Flinux%5Finstall.html?ref=yinguobing.com)详细描述了OpenCV的编译过程[\[2\]](#fn2)。按照该过程编译完成的OpenCV库文件是动态链接库文件，带有`.so`后缀名。我们需要的是静态库文件，后缀名为`.a`，并且属于`Debug`类型。为此需要在cmake做如下配置。

### 配置编译类型为Debug

将`CMAKE_BUILD_TYPE`与`CMAKE_CONFIGURATION_TYPES`的值都改为`Debug`。  
![](https://yinguobing.com/blog/content/images/2016/10/debug-opencv-cmake-01.png)

### 配置库文件为静态库

确认`BUILD_SHARED_LIBS`没有选中。  
![](https://yinguobing.com/blog/content/images/2016/10/debug-opencv-cmake-02.png)

### 配置编译各模块为独立库文件

确认`BUILD_opencv_world`没有选中。  
![](https://yinguobing.com/blog/content/images/2016/10/debug-opencv-cmake-03.png)

完成以上配置后，即可按照OpenCV的官方教程完成OpenCV的编译。最终得到的库文件如下图所示。  
![](https://yinguobing.com/blog/content/images/2016/10/debug-opencv-libs.png)

至此我们得到了可用的OpenCV debug版静态库文件，接下来我们将在eclipse下新建工程，调用这些库文件。

---

## 在Eclipse项目中引用库文件

OpenCV的[这篇官方教程中](http://docs.opencv.org/3.1.0/d7/d16/tutorial%5Flinux%5Feclipse.html?ref=yinguobing.com)提供了在Eclipse下建立工程的方法[\[2:1\]](#fn2)。该方法适用于引用`shared Libraries`，也就是官方默认的编译选项所编译得到的库文件。由于我们需要引用Debug版本的静态库文件，因此需要修改Eclipse项目里的编译配置。

### 获取正确的配置信息

OpenCV的默认安装路径是`/usr/local/lib`。如果你没有更改过的话，你会在这个路径下找到一个`pkgconfig`文件夹，其中有一份名为`opencv.pc`文件。

打开该文件，会发现如下内容：

```
# Package Information for pkg-config

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.1.0
Libs: -L${exec_prefix}/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -L${exec_prefix}/share/OpenCV/3rdparty/lib -llibwebp -lIlmImf -lippicv -L/usr/lib/x86_64-linux-gnu -lpng -lz -ltiff -ljasper -ljpeg -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -ldc1394 -lavcodec-ffmpeg -lavformat-ffmpeg -lavutil-ffmpeg -lswscale-ffmpeg -lstdc++ -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}

```

这份文件基本上告诉了我们所有必要的编译选项。只需按照该文件描述，在Eclipse工程中修改编译选项即可。

### 修改Eclipse项目编译配置

依次点击 `Project > Properties > C/C++ Build > Settings > Tool settings`，打开配置窗口。

#### GCC C++ Compiler

在`includes`选项中添加以下两个路径：

```
/usr/local/include
/usr/local/include/opencv

```

#### GCC C++ Linker

在`Library search path(-L)`下添加以下路径：

```
/usr/local/lib
/usr/local/share/OpenCV/3rdparty/lib
/usr/lib/x86_64-linux-gnu

```

如果你安装OpenCV时采用了不同的路径，对应修改即可。

除了搜索路径，我们还需要添加对应的库文件到`Libraries(-l)`下。这些文件已经在上文的`opencv.pc`中列出，这里为方便起见，再次列出如下。

首先是OpenCV的模块：

```
opencv_shape;opencv_stitching;opencv_objdetect;opencv_superres;opencv_videostab;opencv_calib3d;opencv_features2d;opencv_highgui;opencv_videoio;opencv_imgcodecs;opencv_video;opencv_photo;opencv_ml;opencv_imgproc;opencv_flann;opencv_core

```

以及系统和第三方库：

```
libwebp;IlmImf;ippicv;png;z;tiff;jasper;jpeg;gtk-3;gdk-3;pangocairo-1.0;pango-1.0;atk-1.0;cairo-gobject;cairo;gdk_pixbuf-2.0;gio-2.0;gobject-2.0;gthread-2.0;glib-2.0;dc1394;avcodec-ffmpeg;avformat-ffmpeg;avutil-ffmpeg;swscale-ffmpeg;stdc++;dl;m;pthread;rt

```

> 请留意这些库文件的加载顺序，错误的顺序有可能会导致编译报错。

应用变更后的配置，此时项目应该可以顺利编译完成。

---

OK，以上两步完成后，你就可以尝试启用Debug模式，在调用OpenCV函数的时候Step in到OpenCV函数内部了。现在可以领略OpenCV源码的魅力所在了～

---

## 致谢

本文的完成离不开刘兴东的杰出工作。

---

## Reference

---

1. 《学习OpenCV》，清华大学出版社，于仕琪等 [↩︎](#fnref1)
2. [http://docs.opencv.org/3.1.0/d7/d16/tutorial\_linux\_eclipse.html](http://docs.opencv.org/3.1.0/d7/d16/tutorial%5Flinux%5Feclipse.html?ref=yinguobing.com) [↩︎](#fnref2) [↩︎](#fnref2:1)