从第三方 DLL 调用 Qt 中的函数在调试模式下工作,在发布时崩溃

Posted

技术标签:

【中文标题】从第三方 DLL 调用 Qt 中的函数在调试模式下工作,在发布时崩溃【英文标题】:Calling functions in Qt from third-party DLL works in debug mode, crashes in release 【发布时间】:2011-06-08 08:39:43 【问题描述】:

我使用第三方 DLL (FTD2xx) 与外部设备进行通信。使用 Qt4,在调试模式下一切正常,但在成功完成调用函数后,该版本会静默崩溃。它似乎在返回时崩溃,但如果我在函数末尾向控制台(使用 qDebug)写一些东西,有时它不会在那里崩溃,而是在几行或几十行之后崩溃。

我怀疑一个没有正确清理的堆栈,调试版本可以继续存在,但发布却扼杀了它。有人遇到过类似的问题吗? DLL 本身无法更改,因为源不可用。

【问题讨论】:

也许是优化导致了不同的行为。尝试在禁用优化的情况下编译您的发布版本,看看会发生什么。如果它有效,那么您知道该错误仍然存​​在于某个地方,但您仍然可以发布它...... 我降低了优化级别,它(至少暂时)现在运行而不会崩溃。我首先怀疑 Qt 调试和 Qt 发布 DLL 之间存在差异,但事实并非如此。 您是从 Qt 应用程序调用第三方 DLL 中包含的函数,还是从 DLL 中的代码调用 Qt 函数? 我从 Qt 应用调用第三方 DLL 中包含的函数。 【参考方案1】:

看来降低优化级别是唯一的解决办法。 DLL 本身可能存在问题,因为如果打开优化,程序只调用该 DLL 中的单个函数会以同样的方式崩溃。

幸运的是,优化级别的变化所损失的大小和速度可以忽略不计。

编辑:对于在 Qt 5.0 或更高版本上遇到类似问题的任何人:如果您更改优化级别(例如,更改为 QMAKE_CXXFLAGS_RELEASE = -O0),通常仅重建应用程序是不够的。需要完整的“全部清除”。

【讨论】:

顺便问一下:Qt 和 DLL 使用了哪些编译器? Qt 4.7.0 Win32。关于DLL,我没有自己编译。【参考方案2】:

请注意 - EPANET 库不是线程安全的,它包含许多全局变量。

您是否从不同的线程调用该库的两个方法?

【讨论】:

以上是关于从第三方 DLL 调用 Qt 中的函数在调试模式下工作,在发布时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Qt Creator开发Android程序 如何调用C语言的dll

Qt调用dll中的功能函数

VS2017+QT开发COM组件: 本地与远程附加到进程调试DLL

VS2017+QT开发COM组件: 本地与远程附加到进程调试DLL

为啥 Qt 用户界面在发布模式和调试模式下看起来不同

怎么调用别人的dll文件