IDE/在VS2015中集成Qt开发环境

news/2024/7/16 9:08:17 标签: qt, ide, VS2015, VS2017, 编译错误, LNK2001

文章目录

  • 概述
  • 安装VS2015
  • 安装Qt VS Tools 插件
  • Qt相关配置应用到所有项目
    • 配置增加
    • 配置删除
  • VS项目属性下Qt工程配置(Qt Project Settings)
    • Qt Versions
    • Qt Modules
    • 编辑器找不到Qt的类
  • QtDesigner在VS下使用
    • 无法打开UI/打开失败
    • 找不到UI编译中间文件
    • UI添加的新控件在VS中不识别
  • 常见编译错误
    • LNK2019
    • Qt installation 错误
    • 未定义的标识符 "QWidget/QLabel..."
    • LNK1181 无法打开输入文件

概述

考虑到A项目后期要将相关功能库用C#做外壳封装,也因为使用VS相比QtCreator有更强大的调试能力,决定使用VS2015+Qt5.12作为近期项目的集成开发环境。总结了最近3个月内遇到的一些IDE联合使用的问题。关于VS项目属性页中与Qt无直接关联的配置项,此文基本不涉及。

VS2015_3">安装VS2015

略,请参照其他相关文档。

安装Qt VS Tools 插件

有两种方案。
方案1是从Qt官网下载 相关的插件,如qt-vs-addin-msvc2015-2.0.0-beta. vsix ,然后直接双击安装即可(在VS工具-扩展和更新中,并未找到安装离线插件的选项)。
方案2是直接在VS中进行插件扩展(菜单 - 工具 - 扩展和更新 - 搜索Qt),搜索到插件后在线安装。
相比较之下,方案2是以VS为主线的,它自动提供的插件版本,应该是与Qt对应版本提供的插件版本存在区别的。如果安装环境可以直接联网,建议方案2。

Qt相关配置应用到所有项目

通常的,在项目 - 属性中进行的配置只能对当前项目生效,按照如下方案可对所有项目生效(同样,在取消时,可按照单个项目进行取消,或对所有项目进行取消)。需要首先打开VS属性管理器(视图-其他窗口-属性管理器),后续步骤参照下文。

配置增加

在左侧切换到属性管理器中,如下图选择 Microsoft.Cpp.x64.user 然后右键 --> 选择属性 --> 配置方式与对单独项目进行配置是一样的。
在这里插入图片描述
注意:上图中蓝色选中处的配置,是错误的,不可借鉴。

配置删除

务必注意,通过Microsoft.Cpp.x64.user进行的所有项目参数配置,在单独项目配置时,是只读的,并不能进行修改。比如,上图中,我在探索阶段,错误的配置增加了 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib 目录,当进行具体的项目设置时,想在同样的位置将它删除,是办不到的。

VS项目属性下Qt工程配置(Qt Project Settings)

Qt Versions

… 参见 Qt installation 错误 小节…

Qt Modules

在这里插入图片描述
参见,下文常见编译错误。所有用到的Qt模块都要包含进去,否则,相关模块的类接口将在编译时,报错找不到。在高版本的插件中是可以通过勾选操作实现此条目的编辑的。Qt的模块名字去除Qt字符并小写化,便是此处应该添加的字符串。包括:core;gui;widgets;xml;serialport;network…
有时候,即使你正确添加了模块名称,VS编辑器依然在相关类上提示红色波浪线,此时你可以重新扫描解决方案,必要时重启VS软件。另外,注意Debug和Release都要配置哦。

编辑器找不到Qt的类

问题现象大约是这样的,搞个简单的Demo可以编译成功,但是编辑器中显示Qt的全部类都是不识别的符号,注意这里是编辑器不是编译器。
一般情况下,遇到此类问题,只需要在VS资源管理树的项目名称上,右键,然后执行 “重新扫描解决方案” 即可。若不行,可以尝试重新启动VS软件,再次重新扫描解决方案,如果还是不行,可以看看后边的这些记录。
可以还有两种方案可以解决此问题:
方案1:
在项目属性 -> VC++目录 -> 包含目录中,添加D:\Qt\Qt5.12.8\5.12.8\msvc2015_64\include路径
方案2
在项目属性 -> Qt Project Setting -> Paths -> 头文件搜索路径 选项下,编辑-并插入 Qt_INCLUDEPAT宏,效果如下图。
请添加图片描述
后来,偶然发现:
在项目属性-> C/C++ -> [附加包含目录] 选项中,已经包含了$(Qt_INCLUDEPATH_); 通过查看同事的开发环境,这个配置应该是在进行Qt Project Setttings 附加目录,就已经默认自己存在了,只是,只是,没有编辑器起作用,但是我猜测,之所以编辑器告警,编译器不告警,其根本原因就是这个C/C++ -> [附加包含目录] 中的 $(Qt_INCLUDEPATH_); 对编译器起作用,对编辑器不起作用,我也是醉了!!
还有更加奇怪的(没有再详细测试)
当同事想在 项目属性 Qt Project Setttings -> Additional Qt Header search paths 中增加 $(Qt_INCLUDEPATH_) ;时,却发现他的宏列表中根本就没有这个选项。诡异的是,我的宏列表里也找不到它了,我昨天刚刚从宏列表里将它添加进去的啊! 我在编辑界面,将左侧的 $(Qt_INCLUDEPATH_) 删除保存,然后重新打开,还是找不到啦…
好在经过同事验证,在Additional Qt Header search paths中,手动的将 $(Qt_INCLUDEPATH_) 写入,对编译器也是生效的…
再次遇见奇怪的事情(20221012)
今天首次编译Release版本,准备发布出来测试用。在编译release版本时,先是遇到了Qt Project Setttings -> Qt Modules 配置中缺失 gui;widgets 模块导致的编译错误,轻松解决;之后又发现了编辑器红色波浪线提示,找不到任何的Qt类类型,可是,可是,Additional Qt Header search paths 已经正确配置了啊…
我删除了Qt相关的编译中间文件,重新编译,重新打开代码文件,这个问题就消失了,再不行,亲可尝试重新打开VS试试,或者试试资源树上的重新扫描解决方案…
20230203 工作过程需要,将代码重新从git上clone份,打开新目录下的工程A和B进行编译:再次遇到了编辑器告警Qt类不识别(红色下划线标记)的问题,编译结果无误,Qt Project Setttings配置正确。起初尝试重新编译无效,关闭工程重新打开无效。后来,对工程A进行了一次 “重新扫描解决方案”,暂无效,在此基础上再次关闭VS后重新打开工程A,不识别的问题便不存在啦。打开B工程(未执行重新扫描解决方案),发现其也不再有Qt类不识别的编辑器告警。

QtDesigner在VS下使用

首先,QtDesigner在VS下的使用,相比其在QtCreator下的使用,在功能上是有所阉割的,不要指望像在原生态下的那种好用。

无法打开UI/打开失败

ui文件无法打开,或者打开后闪退,或者是打开后报错(如:未完成的操作、未指定的错误;未将对象应用设置到对象的实例…)。
常用解决方案:
选中一个UI文件,右键 - 打开方式 - 添加 - 选中Qt安装目录下(D:\Qt\Qt5.12.8\5.12.8*msvc2015_64*\bin\)designer.exe 文件,并重新命名,且设置为默认值。

找不到UI编译中间文件

无论如何,首先要先进行一次编译,以使得绘制的UI文件,经过moc编译,生成ui_xxx.h中间文件。默认的存储路径为 …\x64\Debug\uic
这个中间文件的目标路径,应该是可以修改的,且此文件夹路径,应该是要配置到include路径下的。

UI添加的新控件在VS中不识别

如果安装了小番茄,在其设置 Enhanced Listboxes -> Source of C/C++ content: 选择 Default Intellisense,若选择visual assist是识别不到的,详细原因未知。
使用QtDesigner设计师编辑完了UI文件,并确定执行了保存操作,执行了编译过程,查看对应的ui_xxx.h文件,也没有问题,但是在引用ui_xxx.h头文件的VS代码文件中,愣是说找不到新加入的控件!解决方案如下:

  1. 先在ui编辑页面保存新的ui界面 。
  2. 在资源管理树,右键点击ui文件,然后选择编译
  3. 在资源管理树,选中项目,右键,然后选择重新扫描解决方案。

常见编译错误

LNK2019

错误 LNK2019 无法解析的外部符号 “public: void __cdecl CPublishProxy4Qt::SignalProcessToQtObserver(void *,void *,unsigned char *,unsigned int)” (?SignalProcessToQtObserver@CPublishProxy4Qt@@QEAAXPEAX0PEAEI@Z),该符号在函数 “xxx” 中被引用…

使用了信号槽,但却没有在类定义中增加 Q_OBJECT 宏定义,脱离了QtCreator后,更容易忘记啦,而且VS的报错并不明确。

Qt installation 错误

Qt VS Tools -> Qt Versions -> 其中设置的Version名称 (如下图的5.12.8 和 5.12.8_msvc2015_64)会在vs的工程文件.vcxproj中被引用。
请添加图片描述
实际在vcxproj文件中引用如下:5.12.8_msvc2015_64 ,可搜索。其配置路径为,项目-> 属性 -> Qt Project Settings -> Qt Installation 选项中,可以选择不同的Qt安装版本,如下图:
在这里插入图片描述
因此,如果不同开发者的开发环境中,上述配置若不一样,将导致编译异常。直接提示找不到编译器,大约提示如下:There’s no Qt version assigned to project 3DVMS.vcxproj for configuration Debug/x64. Please assign a Qt installation in ‘Qt Project Settings’.

未定义的标识符 “QWidget/QLabel…”

我在VS下新建了一个Qt动态库项目,将以前的一些代码类添加进去,编译的时候报错,提示我部分Qt的类未定义或无法打开头文件,举例:
错误(活动) 未定义标识符 “QAbstractButton” …
错误 C1083 无法打开包括文件: “QLabel”: No such file or directory …
错误(活动) 无法打开 源 文件 “QPushButton” …
在编辑器中,存在红色波浪下警示。但是,像QList、QString、QtCore/qglobal.h等都是不告警的。一开始没有发现什么规律。拿出一个正常的VSQt工程来,打开项目属性,在对比过程中发现:
在这里插入图片描述
新项目中,对Qt模块的引用只有Core,这才恍然大悟。将其他的gui、widgets模块也加进去后,问题得以解决。

LNK1181 无法打开输入文件

编译错误提示 LNK1181 无法打开输入文件“XXX_SDK.lib”
这里的 “输入” 是指 “项目属性 -> 连接器 -> 输入 -> 附加依赖项”,我们已经在上述项目中进行了lib名称(不带路径)的正确配置,如遇上述提示,可以如下操作:
P1(测试可行):在VC++目录 -> 库目录 添加 lib的路径信息
P2(测试可行:在项目属性 -> 连接器 -> 常规 -> 附加库目录 添加lib的路径信息
@note 我们在VS中进行的这些关于 “库” 的配置,均是针对lib的,至于DLL的路径,程序在运行时,操作系统会去按照自己的规则进行搜索和加载。更多关于VS集成开发环境使用本身的问题,请参照其他文章。


http://www.niftyadmin.cn/n/412632.html

相关文章

玄子Share-自然语言编程(NLP)_快速了解知识向 ChatGPT 提问的最佳模板

玄子Share-自然语言编程(NLP)_快速了解知识向 ChatGPT 提问的最佳模板 以下内容均为 ChatGPT 回答 问题描述精确的重要性 玄子: 我向你提问时,问题描述精确的重要性 ChatGPT 3.5 问题描述的精确性非常重要,因为它可以让回答者更好地理解您的…

在Spring Boot微服务使用RedisTemplate操作Redis集群

记录&#xff1a;442 场景&#xff1a;在Spring Boot微服务使用RedisTemplate操作Redis集群的缓存和队列等数据类型。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3,redis-6.2.5。 1.微服务中配置Redis信息 1.1在pom.xml添加依赖 pom.xml文件&#xff1a; <dependency&…

电脑msvcr100.dll丢失的解决方法(一键修复方法)

msvcr100.dll是Microsoft Visual C运行时库的组成部分之一&#xff0c;它是一个重要的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;可在Windows操作系统上运行。它包含了许多C/C语言程序库函数的实现&#xff0c;常常被用于支持和调用不同软件程序的运算&#xff0c…

前后端交互一、服务器概念与初识Ajax

零、文章目录 前后端交互一、服务器概念与初识Ajax 1、上网的过程 网络相关知识请参考网络详解HTTP相关知识请参考HTTP详解 &#xff08;1&#xff09;客户端与服务器 **上网的目的&#xff1a;**通过互联网获取和消费资源 **服务器&#xff1a;**上网过程中&#xff0c;负…

详细讲解!Selenium真正绕过webdriver检测

目录 前言&#xff1a; 一、什么是真正绕过浏览器检测&#xff1f; 2、 普通的启动webdriver 3、Js注入真正绕过webdriver的检测属性 js注入的文件[stealth.min.js] 前言&#xff1a; Selenium是一个流行的开源测试工具&#xff0c;用于网络应用程序测试。它使测试人员能够…

Figma文件保存图片教程,4个详细步骤一网打尽!

在设计领域中&#xff0c;Figma 作为一款备受欢迎的在线协同设计软件&#xff0c;给设计师们带来了许多便利。然而&#xff0c;Figma 目前并不能直接保存图片。那么&#xff0c;有没有什么方法可以解决这个问题呢&#xff1f;答案是使用「即时设计」&#xff0c;这是一款国产的…

嵌入式C语言中if/else如何优化详解

观点一&#xff08;灵剑&#xff09;&#xff1a; 前期迭代懒得优化&#xff0c;来一个需求&#xff0c;加一个if&#xff0c;久而久之&#xff0c;就串成了一座金字塔。 当代码已经复杂到难以维护的程度之后&#xff0c;只能狠下心重构优化。那&#xff0c;有什么方案可以优雅…

jmeter性能测试实战--web程序

目录 前言&#xff1a; 项目背景 测试步骤 前言&#xff1a; JMeter是开源的Java性能测试工具&#xff0c;广泛应用于Web、移动应用程序等领域的性能测试中。在Web应用程序中&#xff0c;JMeter能够模拟多用户并发请求&#xff0c;验证系统在高负载情况下的性能&#xff0c…