查看完整版本: [-- QT调用第三方DLL,debug模式正常,release模式崩溃 --]

QTCN开发网 -> Qt基础编程 -> QT调用第三方DLL,debug模式正常,release模式崩溃 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

dafei2015 2020-04-03 21:20

QT调用第三方DLL,debug模式正常,release模式崩溃

问题描述: 调用第三方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);哪位大佬帮忙分析下可能的原因,谢谢!

liulin188 2020-04-03 21:41
我也遇到过这个问题,换个Qt版本吧

dafei2015 2020-04-03 21:46
我是QT 5.8 换哪个版本呢?

20091001753 2020-04-03 23:15
要换就换最新的。
QT 5.14.2

试试

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

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

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

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

好的谢谢提供思路!

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

QMAKE_CXXFLAGS_RELEASE = -O0   加了这一句就没有崩溃  实在找不到原因了

圣域天子 2020-04-06 14:44
这是让编译器不对代码进行优化。如果有效那问题就复杂了

snow_man_0 2020-04-09 11:32
第三方USB通讯的DLL是不是DEBUG版的?应该用DLL的release版

dafei2015 2020-04-14 23:01
后来换MSVC编译,采用静态库解决的,具体原因定位不了


查看完整版本: [-- QT调用第三方DLL,debug模式正常,release模式崩溃 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled