CMake Release 使我的代码停止正常工作
Posted
技术标签:
【中文标题】CMake Release 使我的代码停止正常工作【英文标题】:CMake Release made my code stop working properly 【发布时间】:2014-02-13 10:30:03 【问题描述】:我有一个 C++ 程序,当我在没有其他选项的情况下进行编译时运行良好。但是,每当我使用 cmake -DCMAKE_BUILD_TYPE=Release 时,代码中有一个非常具体的部分会停止工作。
具体来说,我有一个 Boost Fibonacci Heap 的接口。我正在调用这个函数:
narrow_band_.push(myObject);
这个函数做了以下事情:
inline void myHeap::push (myStruct & c)
handles_[c.getIndex()] = heap_.push(c);
heap_ 在哪里:
boost::heap::fibonacci_heap<myStruct, boost::heap::compare<compare_func>> heap_;
由于某种原因 heap_size 没有被修改,因此其余代码不起作用,因为下一步是从堆中提取最小值并且它始终为空。
在调试模式下它工作正常。感谢您的帮助。
编辑 - 附加信息 我也发现了这个问题:我有一组代码可以进行简单的数学运算。在发布模式下,结果不正确。如果我只是对几个变量进行 cout 来检查它们的值,结果会发生变化,这仍然是不正确的,但很奇怪。
【问题讨论】:
确保永远不要将带有副作用的函数调用放在 assert() 中。我在那个上浪费了很多时间。 我没有使用 assert(),实际上我没有使用任何高级或错误检查功能。但感谢您提供的信息。 这应该是相关的:***.com/questions/312312/…。也许它会有所帮助。 从该提议的帖子中我得到以下信息:如果使用 RelWithDebInf 编译错误消失(这是我的情况),那么它很可能是时间或初始化问题。但是,由于我在单线程程序中运行,我应该关心时间吗?实际上我发现其他数学运算并没有给出预期的结果。 【参考方案1】:我解决了这个问题。这很有趣,但在这种情况下,它不是发布模式中常见的初始化/计时问题。这是在几个函数中缺少 return 语句。在调试模式下,输出是完美的,但在发布模式下失败了。我有禁用警告,这就是为什么我以前没有看到它。
【讨论】:
这就是为什么您不应该停用警告的原因 :-) 我调试某人的代码以发现问题已经被警告突出显示的次数...... 实际上警告没有被停用......只是没有被激活,事实并非如此,因为我从未选择停用它们(我永远不会选择!)^^以上是关于CMake Release 使我的代码停止正常工作的主要内容,如果未能解决你的问题,请参考以下文章
我想从 C++ 非托管代码调用 C# 委托。无参数委托工作正常,但有参数委托使我的程序崩溃