当前位置: 首页 > news >正文

【opencv源码解析0.3】调试opencv源码的两种方式

调试opencv源码的两种方式

上两篇我们分别讲了如何配置opencv环境,以及如何编译opencv源码方便我们阅读。但我们还是无法调试我们的代码,无法以我们的程序作为入口来一步一步单点调试看opencv是如何执行的。

【opencv源码解析0.1】VS如何优雅的配置opencv环境
【opencv源码解析0.2】如何编译opencv库源码

为此我们介绍两种调试opencv的方法。

1、通过VS配置来调试

在上一篇文章中,我们生成了opencv源码工程,基于该工程,我们可以生成debug版本的动态链接库opencv_world460d.dll,以及调试信息文件opencv_world460d.pdb。

我们想要调试opencv的源码,只需要将这两个文件拷贝到我们自己项目的可执行文件的同级目录内即可。

例如我们一直在使用的test_link_opencv这个工程:

在这里插入图片描述

完成拷贝后,直接在工程中打断点进行单步调试,即可进入opencv源码内调试了。

2、通过在opencv源码内部进行调试

上面的方法可以使我们基于我们自己的项目,来调试opencv的源码。但上篇文章中我们已经构建了opencv源码工程了,如果仅仅是为了学习、阅读源码,我们可以在opencv源码工程内进行调试。

首先opencv提供了许多examples示例程序,我们在cmake-gui的options中,找到选项

  • BUILD_EXAMPLES:构建示例程序

并勾选,然后重新点击configure和Generate:

在这里插入图片描述

然后重新打开我们的VS工程,就可以找到官方提供的例程了:

在这里插入图片描述

我们可以将配置改为Debug x64模式,再将其中一个例程设为可执行程序,就可以直接调试了。

如果例程的内容不是你想调试的内容,那你也可以建一个自己的例程项目,然后在该项目里写自己想要调试的代码,这要怎么做到呢?

我们在opencv\sources\samples\cpp\CMakeLists.txt文件中,可以看到该cmake文件对该samples路径下的每一个.cpp文件,都应用了

ocv_define_sample(tgt ${sample_filename} ${package})

这个函数,这个函数位于opencv\sources\samples\samples_utils.cmake:

# Utility function: adds sample executable target with name "example_<group>_<file_name>"
# Usage:
#   ocv_define_sample(<output target> <relative filename> <group>)
function(ocv_define_sample out_target source sub)get_filename_component(name "${source}" NAME_WE)set(the_target "example_${sub}_${name}")if(OPENCV_DUMP_EXAMPLE_TARGET)message(STATUS "Example: ${the_target}    (${source})")endif()add_executable(${the_target} "${source}")if(TARGET Threads::Threads AND NOT OPENCV_EXAMPLES_DISABLE_THREADS)target_link_libraries(${the_target} PRIVATE Threads::Threads)endif()set_target_properties(${the_target} PROPERTIES PROJECT_LABEL "(sample) ${name}")if(ENABLE_SOLUTION_FOLDERS)set_target_properties(${the_target} PROPERTIES FOLDER "samples/${sub}")endif()if(WIN32 AND MSVC AND NOT BUILD_SHARED_LIBS)set_target_properties(${the_target} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG")endif()# Should be usable in stand-alone build scenarioif((NOT DEFINED INSTALL_BIN_EXAMPLES AND WIN32) OR INSTALL_BIN_EXAMPLES)if(NOT DEFINED OPENCV_SAMPLES_BIN_INSTALL_PATH)set(OPENCV_SAMPLES_BIN_INSTALL_PATH "samples")endif()install(TARGETS ${the_target} RUNTIME DESTINATION "${OPENCV_SAMPLES_BIN_INSTALL_PATH}/${sub}" COMPONENT samples)endif()# Add single target to build all samples in the group: 'make opencv_samples_cpp'set(parent_target opencv_samples_${sub})if(NOT TARGET ${parent_target})add_custom_target(${parent_target})if(TARGET opencv_samples)add_dependencies(opencv_samples ${parent_target})endif()endif()add_dependencies(${parent_target} ${the_target})set(${out_target} ${the_target} PARENT_SCOPE)
endfunction()

该函数将每一个samples路径下的.cpp文件,都单独生成为了一个exe可执行项目,因此呢,我们要往samples内添加我们自己的项目也很简单,只需要在路径

opencv\sources\samples\cpp\文件夹内添加一个.cpp文件即可。

我们添加一个sherad_opencv.cpp文件:

在这里插入图片描述

然后重新在cmake-gui内点击configure和Generate按钮,然后重新打开opencv的VS源码工程,就可以看到我们添加的shredOpencv项目了:

在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/12731.html

相关文章:

  • Xcode Archives打包上传 / 导出ipa 发布至TestFlight
  • RNN GRU模型 LSTM模型图解笔记
  • 西电_数字信号处理二_学习笔记
  • [ vulhub漏洞复现篇 ] Drupal 远程代码执行漏洞(CVE-2018-7602)
  • MySQL最佳实践
  • Python 之 Matplotlib 散点图、箱线图和词云图
  • SpringCloud(三)Hystrix断路器服务降级、服务熔断、服务监控案例详解
  • 【超好用】自定义的mybatis-plus代码生成器
  • Kubernetes学习笔记-计算资源管理(4)监控pod的资源使用量20230219
  • 游戏开发 - 开发流程 - 收集
  • LA@向量空间@坐标变换
  • JSP脚本指令及标记学习笔记
  • 【C语言每日一题】——猜凶手
  • 2019蓝桥杯真题完全二叉树的权值 C语言/C++
  • 大数据之Phoenix环境搭建
  • 62 一次 Promotion failed 的调试
  • Git的基本操作
  • LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
  • 测试1:测试相关概念
  • 2.19 索引和事务
  • 算法导论【摊还分析】—聚合分析、核算法、势能法
  • 【LeetCode】剑指 Offer 08. 二叉树的下一个节点 p65 -- Java Version
  • Python 之 Pandas Series 数据结构
  • 【java基础】Java常用类———包装类
  • linux shell 入门学习笔记3 shebang
  • 写作小课堂:简历模版【A4纸正反两面】(20230219)
  • 一文搞懂 DevOps
  • 深入讲解Kubernetes架构-租约
  • 微信小程序学习第11天——Vant Weapp组件库、API Promise化、全局数据共享Mobx、分包
  • Python3-基本数据类型