gpt4 book ai didi

C++ 编译引入错误

转载 作者:太空狗 更新时间:2023-10-29 21:21:45 29 4
gpt4 key购买 nike

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

错误是 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 调用 _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 行)并陷入其中,因为它在第一行调用 int k = kind();,而不是调用 cv::kind(),而是调用:

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

再次调用 kind() 再次调用 type()(而不是它应该的 kind()),生成无限递归循环,带来堆栈溢出

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

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

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

编辑:

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

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

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

编辑 2

我找到了这个旧线程:http://code.opencv.org/issues/2218用户似乎遇到了与我相同的问题,只需在关闭 OPENCV_CAN_BREAK_BINARY_COMPATIBILITY 的情况下运行 CMake 即可解决问题。但是这个选项不再出现在新版本的 OpenCV 中,如此处所述 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 - 我不能告诉)。

关于C++ 编译引入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998478/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com