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# 委托。无参数委托工作正常,但有参数委托使我的程序崩溃

异步任务使我的应用程序崩溃

(discord.py) 如何使我的 setprefix 命令正常工作?

CMake RelWithDebInfo 链接到调试库

如何使我的代码可停止? (不杀/打断)

如何使我的 SwiftUI 网格视图正常工作?