VS里正常的代码在QT里执行有问题?要怎么弄好QT的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS里正常的代码在QT里执行有问题?要怎么弄好QT的?相关的知识,希望对你有一定的参考价值。

在安装 QT+MSVC环境的时候,该出的问题我想都让我碰上了。

    问题1 :jom.exe 崩溃,构建不通过。

    jom: ......... Error 219:19:11: 进程"E:\\QT1\\Tools\\QtCreator\\bin\\jom.exe"退出,退出代码 2 。Error while building/deploying project untitled (kit: Desktop Qt 5.5.1 MSVC2015 64bit)When executing step "Make"

    这个我没有出现什么cl 不是内部命令的提示,至于使用nmake就更错了,nmake运行就出问题,估计是安装时nmake就有问题了。所以不是环境变量之类的错误,由于我前期先安装的QT+MinGW,后来需要MSVC才安装的vs2015,估计是这个安装先后顺序导致一些配置不对,反正我的kit配置都没有错误提示了也不行,干脆直接全卸了重新来。这次OK了,msvc,mingw都能用了。后来看到有初始化msvc编译环境的脚本,如果不行就先使用下试试,没准就OK了,不用浪费时间重新安装(安装时间好长呀) 

    1

    问题2 -1: error: LNK2019: 无法解析的外部符号 **,该符号在函数 ** 中被引用,看图说话。 

    无法解析的外部符号说明,该函数的库或头文件没有被引入,比如下面

    qmfcapp.obj : error LNK2019: 无法解析的外部符号 __imp_SetWindowsHookExW,该符号在函数 "public: static bool __cdecl QMfcApp::pluginInstance(void *)" (?pluginInstance@QMfcApp@@SA_NPEAX@Z) 中被引用

    在QT中找到QMfcApp::pluginInstance函数查看了下使用到外部函数的地方SetWindowsHookEx,点击可以跳转到头文件WinUser.h,那就是库没有了。由于原来是MinGW,内部的库都导入了,转到MSVC后一些自带的系统库没有加进来。百度查找SetWindowsHookEx该函数所需库User32.lib,在电脑上搜了。然后在.pro工程文件中右键加入库如下


    把加后缀的勾删了,我这window下好像没有专门的d版调试库。 
    OK。这时在库里就自动加上了下面这几行。

    unix|win32: LIBS += -L'C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x64/' -lUser32INCLUDEPATH += 'C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x64'DEPENDPATH += 'C:/Program Files (x86)/Windows Kits/8.1/Lib/winv6.3/um/x64'

    1

    2

    3

    4

    1

    问题3 User32.Lib:-1: warning: LNK4272:库计算机类型“X86”与目标计算机类型“x64”冲突 
    刚开始时找错了库,找到的是32位编译出来的user32.lib库,后来直接到系统盘window下找到了64位的就OK了。

    问题4 This application has requested the Runtime to terminate it in an unusual way

    这个在我安装了vs2015就出现了这问题,没装时都好好的。这个上一篇有讲到,这次又遇上了,我真的是无语了,也是莫名其妙的又不报了。具体怎么弄好的我也摸不着,vs2015又装了VC++里的所有部分(MFC类,兼容XP什么的两个,原本就一个VC++编译器的),到qt安装目录里有个vcredist_msvc2015_x86运行,重启后也一样,然后还有什么,重新拷贝库?一堆事情,一个个试都不好,换vb,vs,突然之间就好了,可是VB来错误53,找不到dll了,vs来加载格式不正常,这个看问题5。但有一点可以肯定—-错误与下面的dll无关,这个是depends找不到有关的bug。 

    问题5 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    这里是目标平台和库不一致,需要注意下,用MinGW编译的去MinGW版的QT库里找对应的库(debug版和release版),然后要注意的是它是32位的,所以vs里只能选择X86平台。貌似没有找到有64的MinGW版本的QT. 
    而MSVC我下的是64的,所以只能选则X64平台。拷贝库也是到msvc版的QT库里找。如果库位数不对,会呈粉红色。 

    问题6 其他信息: 无法加载 DLL“bstdll.dll”: 找不到指定的程序。 (异常来自 HRESULT:0x8007007F)。 

    换成X86的拿mingw编译出来的试出这问题,拿到在VB下就是 实时错误53:找不到DLL的意思了。这个估计就是跟安装了vs2015的问题有关了。安装了vs2015后VC++估计把我一些32位的库给弄掉了,怎么都无法成功了。尝试下个msvc 32位的编译看是否一样。

    问题7 error: C2373: “saveImage”: 重定义;不同的类型修饰符 
    同样的代码用64的编译器和MinGW都没问题,换成32位的msvc就出问题了, 
    .h文件

    extern "C" BSTDLLAPI void __stdcall saveImage(const char *file);

    .cpp文件

    void  saveImage(const char *file)
    dev.savePicture(file);

    平常看到的讲解导出dll都没要求实现里也要加上__stdcall ,这里报错就是这个原因,.cpp里也加个__stdcall 就OK了。

    1

    2

    3

    1

    问题8 其他信息: 无法在 DLL“xxx.dll”中找到名为“xxx”的入口点。

    到这一部至少说明,dll可以被找到,目标平台和生成的dll也是一致的,只是入口函数找不到,可能是导出名不对了,depends查看下果然名字被过度修饰了。变成了_function@bytenum形式。 
    怎么解决我不知道msvc的编译器有没有这个选项,直接改成这个名字算了。

    问题9 发生了 PInvokeStackImbalance 
    对 PInvoke函数的调用导致堆栈不对称。 

    先看看是不是调用协议不对,vb是__stdcall,vc++默认用__cdecl,如果一致了还出错,那可能是long要改成int32,这个尝试改下就行了。我就是这么解决的。

    到此,无论是64还是32位都能用了。坑好多啊。MinGW版不知道为什么就是错误提示找不到dll,装了个VS2015麻烦这么多。有知道的大神可以解惑下。 
    有些人说MinGW版编译的dll不能在window下用是有问题的,反正我不装VS2015时一切都好好的。如上篇所述,而且也在别人机子上试过。现在没时间找这个问题了,能用就行了。

参考技术A

过 那么多天了, 解决了吗?

编译不过,你可以看看Qt的输出信息, 是不是你Qt的配置有问题? 编译器版本选错了。。

    先点击左下角的小电脑, 切换合适的编译版本

    如果没有配置,你需要到 工具栏->构建里面, 选择编译器与Qt版本(这两个需要同样的编译器出来) 然后再执行1,选择合适的版本

QT工程编译

电脑中装了多个QT版本时,在我的电脑里,有QT 5.3.2 配合VS2013,有QT5.11.2配合VS2019。

导入别人编写的QT工程时,注意要在QT VS TOOL里选择好对应的编译器版本。

技术图片

 

 在Qt Project Settings里保证

技术图片

 

 vs的头文件包含里注意。我电脑5.3.2版本QT装在E盘根目录

E:QtQt5.3.25.3msvc2013_64includeQtCore;E:QtQt5.3.25.3msvc2013_64includeQtGui;E:QtQt5.3.25.3msvc2013_64includeQtWidgets;E:QtQt5.3.25.3msvc2013_64includeQtXml;E:QtQt5.3.25.3msvc2013_64includeQtNetwork;E:QtQt5.3.25.3msvc2013_64includeQtMultimedia;E:QtQt5.3.25.3msvc2013_64include;E:QtQt5.3.25.3msvc2013_64includeQtSql;

技术图片

 

 这里很重要的一步是,把E:QtQt5.3.25.3msvc2013_64include包含进来

链接阶段

General选项下的子选项 Additional Libary Dicrectories 添加

E:QTQT5.3.25.3MSVC2013_64lib;E:QtQt5.3.25.3msvc2013_64lib;

Input选项下的子选项Additional Dependencies 添加

E:QTQT5.3.25.3MSVC2013_64libqtmain.lib;E:QtQt5.3.25.3msvc2013_64libQt5Core.lib;E:QTQT5.3.25.3MSVC2013_64libQt5Multimedia.lib;E:QTQT5.3.25.3MSVC2013_64libQt5Widgets.lib;E:QTQT5.3.25.3MSVC2013_64libQt5Xml.lib;E:QTQT5.3.25.3MSVC2013_64libQt5Sql.lib;E:QTQT5.3.25.3MSVC2013_64libQt5Network.lib;E:QTQT5.3.25.3MSVC2013_64libQt5Gui.lib;E:QTQT5.3.25.3MSVC2013_64libQt5Core.lib;

 

如果编译中出现

Error 19 error MSB3073: The command ""C:QTQT5.3.25.3MSVC2013_64in cc.exe"   一般是QT资源文件位置没找对

检查下面的配置

技术图片

 

 技术图片

 

 如果出现std::numeric_limits<qint64>::min()  相关的报错,需要把min包含起来

 

 

 

 

以上是关于VS里正常的代码在QT里执行有问题?要怎么弄好QT的?的主要内容,如果未能解决你的问题,请参考以下文章

QT工程编译

在Qt Creator 和在 vs2012 里添加信号和槽

静态代码检查工具 cppcheck 的使用(可分别集成到VS和QT Creator里)

VS2010怎么加载QT的QICON

Visual Studio里使用Qt

请问怎么查看QT自带函数,QT里那些像close的函数怎么查看原代码?