C++编译引入错误

2024-03-23

我在 Visual Studio 2010 中有一个多线程 C++ windows 项目,它使用 Qt (5.1.1) 和 OpenCV (2.4.8)。当我构建它时Debug模式一切运行正常,但是当我构建它时Release模式下程序崩溃。两种配置几乎相同(只是在发布中我有多线程 DLL /MD,在调试中我有多线程调试 DLL /MDd),我禁用了发布的优化,甚至启用了调试来捕获错误。最奇怪的是,崩溃的同一段代码在另一个控制台项目中运行得很好。

该错误是 OpenCV 代码的内部错误,与我的代码无关,我的代码只是:

void MyProject::findEllipses(QImage &frame, vector<RotatedRect> &ellipses)
{       
    Mat image = Mat(frame.height(), frame.width(), CV_8UC4, frame.scanLine(0));                 

    cvtColor(image, image, CV_RGB2GRAY);
    GaussianBlur(image, image, Size(3, 3), 0, 0, 4);            
    threshold(image, image, treshVal, 255, THRESH_BINARY);

    vector<vector<Point> > contours;               
    Mat contoursImage = image.clone();    
    findContours(contoursImage, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE, Point(0, 0)); 
// ....Mode Code

正如我在Debug代码运行没有问题,findContours calls _contours.create(total, 1, 0, -1, true);(在OpenCV的contours.cpp的第1720行)并继续该方法......但是在Release,当我踏入_contours.create(total, 1, 0, -1, true),程序没有执行该方法,而是跳转到void _OutputArray::clear() const(matrix.cpp 第 1674 行)并且 get 被困在那里,因为它调用int k = kind();在它的第一行,而不是调用cv::kind(), calls:

 int _InputArray::type(int i) const
 {
    int k = kind();

哪些细胞会衰老kind()再次调用type()(代替kind()正如它应该的那样),进行无限递归循环,带来堆栈溢出.

我尝试创建一个新的 Visual Studio 2010 项目来查看这是否是项目创建问题,但问题仍然存在。

我的猜测是,函数地址在发布模式下是错误的,因此当它尝试调用时create(),它反而调用另一个地址,使堆栈变得混乱,但这只是我的猜测。起初我会责怪 OpenCV 发布的 dll,但是,正如我所说,在另一个仅运行特定代码的控制台项目中,代码在机器人构建模式下运行良好。我不明白我的其他线程和代码如何触发此行为,因为该错误归结为 OpenCV 中的错误函数调用。

这远远超出了我的知识范围,我不知道如何解决这个问题,我感谢我在这个问题上可以获得的所有帮助,因为我已经用尽了我所有的想法来解决它......

EDIT :

我做了一个小项目,这样任何人都可以看到发生了什么。

这些文件位于:https://app.box.com/s/3owljl44emv57erinrf8 https://app.box.com/s/3owljl44emv57erinrf8

为了运行它,您必须拥有 OpenCV 2.4.8 和 Qt 5.1.1 并配置 Visual Studio 2010 项目以从正确的位置获取包含文件。在资源文件夹中,有一个将被加载的图像,并且在 SaraVisualControl.cpp 第 20 行中,您必须放置图像的正确路径,抱歉我没有自动执行此操作,但我急于将其打包到一个小项目。有关如何运行的任何其他问题,请告诉我。

EDIT 2

我发现了这个旧线程:http://code.opencv.org/issues/2218 http://code.opencv.org/issues/2218用户似乎有与我相同的问题,只需在关闭 OPENCV_CAN_BREAK_BINARY_COMPATIBILITY 的情况下运行 CMake 似乎可以解决该问题。但这个选项在新版本的 OpenCV 中不再存在,如此处所述http://code.opencv.org/issues/2358 http://code.opencv.org/issues/2358。有谁知道这的含义以及它如何相关?


我过去在混合 VC 运行时版本时遇到过类似的症状。如果您使用的是 VC2010,而 OpenCV 2.4.8 是在 2012 年甚至 2013 年构建的,那么您的 ABI 不匹配。例如,std::vector 的内存布局不同,可能某个地方的 vtable 中某些方法的顺序发生了变化,等等。

测试这一点的一个简单方法是在调试时检查“模块”窗口并查找更高版本的运行时 dll。您的是 msvcr100d.dll,如果您看到 msvcr110d 或 120d - 这可能是源。 (假设你和 OpenCV 都动态链接到 CRT - 我无法告诉)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++编译引入错误 的相关文章

随机推荐

  • Mathematica 8 中函数声明的问题

    这是一个奇怪的结果 在此示例中函数定义为 functionB 有人可以解释一下吗 我想绘制functionB x and functionB Sqrt x 它们一定是不同的 但是这段代码表明functionB x functionB Sqr
  • 如何获得从一种颜色到另一种颜色的中间颜色? [复制]

    这个问题在这里已经有答案了 可能的重复 两种颜色之间的android颜色 基于百分比 https stackoverflow com questions 4414673 android color between two colors ba
  • 如何在 SQLite 中比较两个日期?

    我有点假设它是一个字符串 所以我将它作为一个字符串进行比较 但毫不奇怪它失败了 我相信这就是 Mysql 的工作原理 我可能是错的 因为我已经有一段时间没有工作了 无论哪种情况 如何检查 SQLite 中的日期是否相等 我将在 WHERE
  • Alamofire - 未进行代码签名,因为其设置未指定 Xcode 8 中的开发团队

    我在 Xcode 8 上遇到了下面的错误 大家能帮忙解决一下吗 我的应用程序需要支持iOS 8及以上版本 Alamofire 不会进行代码签名 因为其设置未指定开发团队 对于使用 Swift 的目标 需要正确配置 使用旧版 Swift 语言
  • 使用进程c#进行错误处理

    我使用 C 创建了一个控制台应用程序 并使用以下命令从另一个 Windows 窗体应用程序调用它Process 下面是我的控制台应用程序代码 static void Main string args try my code catch Ex
  • JDBCRealm 和 DataSourceRealm 有什么区别? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我读到了这样的评论 根本不要使用 JDBCRealm 它根本无法扩展 因为有一个 JDBC Connection 对象用于所有数据库通
  • python和谷歌云存储

    我找不到如何使用谷歌云存储而不在谷歌应用程序引擎上运行它的示例 我想要这样的东西 这对我很有用 https github com GoogleCloudPlatform storage getting started javascript
  • JQuery 更改在模糊之前不会触发

    我使用change handler 来监听textarea的更改事件 但我只在textarea失去焦点时收到事件 但我想在值更改时立即收到事件 text object change listener function listener do
  • 避免在自定义交叉过滤器归约函数中进行多次求和

    这个问题是由于创建过程中遇到的一些困难而产生的crossfilter数据集 特别是如何对不同维度进行分组并计算派生值 最终目标是拥有一批dc js使用维度和组的图表 小提琴示例https jsfiddle net raino01r 0vjt
  • 用户日期时间设置为 GMT,如何将日期转换为其本地化设置?

    在我的用户设置中 我有一个下拉菜单 其中包含所有 GMT 日期供用户选择 在 C 中 如何将数据库中存储的日期时间转换为 GMT 时间 数据库中存储的时间为服务器时间 对于 NET 3 5 您可以将系统时区标识符与用户一起存储 您可以从Ti
  • 浏览器如何处理高度和宽度的非整数值?

    当浏览器给出的元素的宽度和高度不是整数值时 它们如何处理它们 尤其 非整数值在什么阶段进行四舍五入 它们是四舍五入到最接近的整数 还是截断它们 当容器的子元素具有非整数尺寸时 是否会出现子元素长度或高度之和不等于父元素的内部宽度 高度的情况
  • 显示 UILabel * 秒;除了 NSTimer 之外还有其他方法吗?

    是否有其他方式显示对象 按钮 其他内容 例如 3 秒而不是 NSTimer 我可以使用动画来做到这一点吗 您可以使用 performSelector withObject afterDelay 尽管它内部使用了一个计时器 theLabel
  • 获取 NSTextField 内容以缩放

    我怎样才能让文本比例适合我给它的边界 我过去也做过类似的事情 void calcFontSizeToFitRect NSRect r float targetWidth r size width xMargin float targetHe
  • C++ 按升序打印文件名

    我正在使用以下代码来迭代目录中的文件 该目录中的所有文件都有编号 每个文件都有唯一的编号 下面的代码成功打印出目录中的所有文件 但不是按升序排列 它完全随机出现 并且有一个文件是重复的 我找不到另一种打印文件或按升序打印文件的方法 我确实需
  • C# Xamarin Forms - 执行任务,超时

    和其他许多人一样 我需要编写一个返回任务的函数 并且我希望该任务在一段时间后自动超时 初始代码如下所示 class MyClass TaskCompletionSource
  • 按 nginx 中的位置提供 pdf 文件

    我如何提供文件 webapps app static downloads privacy policy pdf 按地址 https my site net privacy 我尝试在 nginx 中使用位置 但这不起作用 location p
  • Dropwizard ExceptionMapper:验证原始标头字段

    有谁知道如何从请求中获取原始标头字段 我想验证客户端是否会收到 html 或只是纯 文本响应 我可以在异常映射器的 toResponse 方法中获取此字段吗 我像这篇文章中一样创建了异常映射器 http gary rowe com agil
  • 使用温莎城堡解析 HttpControllerContext

    In the ASP NET Web API http www asp net web api HttpControllerContext实例提供了很多有关当前环境的信息 包括当前请求的URI 如果服务依赖于此类信息 例如请求 URI 则应
  • 在 Windows 上使用 Python 3.7 安装 pycairo

    我正在尝试安装 pycairo 尽管我在互联网上找到了这些内容 但我无法安装它 我确实 pip install pycairo 但它要求我安装 Visual Basic Build Tool 我做到了 但当时不起作用 我尝试了在网上找到的很
  • C++编译引入错误

    我在 Visual Studio 2010 中有一个多线程 C windows 项目 它使用 Qt 5 1 1 和 OpenCV 2 4 8 当我构建它时Debug模式一切运行正常 但是当我构建它时Release模式下程序崩溃 两种配置几乎