• 4251阅读
  • 9回复

[提问]QT调用第三方DLL,debug模式正常,release模式崩溃 [复制链接]

上一主题 下一主题
离线dafei2015
 

只看楼主 倒序阅读 楼主  发表于: 2020-04-03
问题描述: 调用第三方USB通讯的DLL,debug模式各项功能正常,release模式DLL调用崩溃。
1.可以确定DLL路径正常,采用QLibary显示调用,
2.检查了所有变量都初始化了
函数原型 ushort SI_GetNumDevices(LPDWORD lpdwNumDevices);    
我的代码: DWORD x = 0 ;
typedef  quint16(*Func)(LPDWORD); Func open = (Func)SI_DLL.resolve("SI_GetNumDevices");          open(&x);哪位大佬帮忙分析下可能的原因,谢谢!
本帖提到的人: @20091001753 @圣域天子 @toby520
离线liulin188

只看该作者 1楼 发表于: 2020-04-03
我也遇到过这个问题,换个Qt版本吧
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线dafei2015

只看该作者 2楼 发表于: 2020-04-03
我是QT 5.8 换哪个版本呢?
离线20091001753

只看该作者 3楼 发表于: 2020-04-03
要换就换最新的。
QT 5.14.2

试试
(づ ̄ 3 ̄)づ
离线圣域天子

只看该作者 4楼 发表于: 2020-04-04
说我常见的原因,但未必确保你也是这个原因:
Debug模式下,VC编译器对内存有保护,有时重复删除内存不会引起崩溃。
但Release模式下,就没有保护了,会容易出现崩溃。
对于第三方DLL常见于 delete, 或 renew或reset之类的操作。
有常见于对象是初始化后传给DLL的,还是由DLL自己new的。

建议你可以先从屏蔽掉delete代码着手调试。

我的习惯是开发阶段默认直接用 release 模式编译的,除非一定要进行debug调试,才再用debug编译。因为debug下OK的程序在release下出现异常已碰到过无数次了~~~
离线dafei2015

只看该作者 5楼 发表于: 2020-04-05
回 圣域天子 的帖子
圣域天子:说我常见的原因,但未必确保你也是这个原因:
Debug模式下,VC编译器对内存有保护,有时重复删除内存不会引起崩溃。
但Release模式下,就没有保护了,会容易出现崩溃。
对于第三方DLL常见于 delete, 或 renew或reset之类的操作。
有常见于对象是初始化后传给DLL的,还是由DLL自己n .. (2020-04-04 18:04) 

好的谢谢提供思路!
离线dafei2015

只看该作者 6楼 发表于: 2020-04-06
回 圣域天子 的帖子
圣域天子:说我常见的原因,但未必确保你也是这个原因:
Debug模式下,VC编译器对内存有保护,有时重复删除内存不会引起崩溃。
但Release模式下,就没有保护了,会容易出现崩溃。
对于第三方DLL常见于 delete, 或 renew或reset之类的操作。
有常见于对象是初始化后传给DLL的,还是由DLL自己n .. (2020-04-04 18:04) 

QMAKE_CXXFLAGS_RELEASE = -O0   加了这一句就没有崩溃  实在找不到原因了
离线圣域天子

只看该作者 7楼 发表于: 2020-04-06
这是让编译器不对代码进行优化。如果有效那问题就复杂了
离线snow_man_0

只看该作者 8楼 发表于: 2020-04-09
第三方USB通讯的DLL是不是DEBUG版的?应该用DLL的release版
离线dafei2015

只看该作者 9楼 发表于: 2020-04-14
后来换MSVC编译,采用静态库解决的,具体原因定位不了
快速回复
限100 字节
 
上一个 下一个