本文不涉及QML,因为我没用过
用C++写窗体,同时还有可视化UI界面,这不比控制台程序香吗?QAQ我大一写c++大作业的时候要是知道这个东西,我绝对满分啊!!!!
To:
新版的Clion 增加了对Qt的支持,的确是可以直接在Clion构建Qt项目,不过我的建议是先在Qt Creator里先新建项目(在这里构建的项目与在Clion里构建的项目,其CMakeLists.txt 有很大的不同,由Qt构建的CMake是最主要的部分,Clion的可以参考),可以运行了再尝试搬到clion去配置环境
ps:就算是使用Clion,设计ui的时候还是得回到 Qt Creator里的
目录
- Qt安装内容
- 环境配置
- MinGW
- MSVC
- Debug调试
- 编译问题
- ...\Qt\5.15.2\msvc2015_64\lib\Qt5Widgetsd.lib : warning LNK4272:库计算机类型“x64”与目标计算机类型“x86”冲突
- error LNK2019: 无法解析的外部符号 _RTC_CheckStackVars,函数 main 中引用了该符号
- Error running 'Build': Cannot start process, the working directory '...\cmake-build-debug-msvc' does not exist
- 特殊技巧
- 添加动态库
- 打开ui文件
Qt安装内容
Qt的安装过程百度上到处都是这里就不写了,主要想分享的是我对于Qt安装器里下载的内容的了解:
咳咳 字有点小 将就一下 (>人<;)
我的Qt安装目录
Qt
5.15.2 # 版本包
mingw81_64
msvc2015_64
msvc2019_64
bin
assistant.exe # 查Qt API的
designer.exe # ui设计器
windeployqt.exe # 打包工具
libstdc++-6.dll # 超级重要的链接库 项目里缺了它就重定位不了 无法使用动态库
opengl32sw.dll # opengl库
...
Src
dist
Docs
Examples # 样例 这个可以多看看 超有用
installerResources
Licenses
Tools # 工具包
CMake_64 # CMake软件
mingw810_64 # mingw 64位编译器
Ninja # 忘了是啥了 反正挺重要的
QtCreator # IDE
QtDesignStudio # 图标设计器
sdktool
verdist
components.xml
InstallationLog.txt
MaintenanceTool.exe # 安装器
MaintenanceTool.dat
MaintenanceTool.ini
network.xml
环境配置
Clion的配置主要还是靠Settings里的 Toolschains(工具) 和 CMake(具体运用到工程里的配置)
不需要添加到path(环境变量)里
Qt x.xx.x/msvc/bin 得添加到 path里,不然程序找不到Qt的动态库
MinGW
配置
Qt 5.15.2 + clion 2022.3.2 + mingw81_64(Qt里安装的那个)
虽然官网说CMAKE_PREFIX_PATH
可以写在CMakeLists.txt,但我不建议你写在CmakeLists.txt里,毕竟和别人合作写项目时,别人可不一定有这个路径,而写在Settings里就没有这个问题
-G Ninja -DCMAKE_PREFIX_PATH=你的Qt下的mingw的路径
MSVC
配置
Qt 5.15.2 + clion 2022.3.2 + MSVC 2019
MSVC需要安装Visual Studio ,Qt只提供cmake及相关qt程序文件,在Visual Studio installer 里安装 MSVC xxxx c++生成工具
+Windows SDK x
虽然官网说CMAKE_PREFIX_PATH
可以写在CMakeLists.txt,但我不建议你写在CmakeLists.txt里,毕竟和别人合作写项目时,别人可不一定有这个路径,而写在Settings里就没有这个问题
-G Ninja -DCMAKE_PREFIX_PATH=你的路径
Debug调试
Clion无法查看QString等Qt特有的类的信息,需要额外的辅助
拷贝这个文件:qt5.natvis
放到项目的跟目录下,不需要其他设置,在你调试的时候Clion会自动寻找根目录下的这个文件
编译问题
…\Qt\5.15.2\msvc2015_64\lib\Qt5Widgetsd.lib : warning LNK4272:库计算机类型“x64”与目标计算机类型“x86”冲突
main.cpp.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall QString::~QString(void)" (__imp_??1QString@@QAE@XZ),函数 _main 中引用了该符号
main.cpp.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall QString::QString(char const *)" (__imp_??0QString@@QAE@PBD@Z),函数 _main 中引用了该符号
main.cpp.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall QApplication::QApplication(int &,char * *,int)" (__imp_??0QApplication@@QAE@AAHPAPADH@Z),函数 _main 中引用了该符号
main.cpp.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall QApplication::~QApplication(void)" (__imp_??1QApplication@@UAE@XZ),函数 _main 中引用了该符号
main.cpp.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: static int __cdecl QApplication::exec(void)" (__imp_?exec@QApplication@@SAHXZ),函数 _main 中引用了该符号
main.cpp.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void __thiscall QWidget::show(void)" (__imp_?show@QWidget@@QAEXXZ),函数 _main 中引用了该符号
main.cpp.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void __thiscall QWidget::resize(int,int)" (__imp_?resize@QWidget@@QAEXHH@Z),函数 _main 中引用了该符号
main.cpp.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall QPushButton::QPushButton(class QString const &,class QWidget *)" (__imp_??0QPushButton@@QAE@ABVQString@@PAVQWidget@@@Z),函数 _main 中引用了该符号
main.cpp.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall QPushButton::~QPushButton(void)" (__imp_??1QPushButton@@UAE@XZ),函数 _main 中引用了该符号
D:\Tools\IDE\Qt\5.15.2\msvc2015_64\lib\Qt5Widgetsd.lib : warning LNK4272:库计算机类型“x64”与目标计算机类型“x86”冲突
D:\Tools\IDE\Qt\5.15.2\msvc2015_64\lib\Qt5Guid.lib : warning LNK4272:库计算机类型“x64”与目标计算机类型“x86”冲突
D:\Tools\IDE\Qt\5.15.2\msvc2015_64\lib\Qt5Cored.lib : warning LNK4272:库计算机类型“x64”与目标计算机类型“x86”冲突
注意了这不是通常可以忽略的警告,而是非常严重的报错,会导致找不到Qt5Widgetsd.lib链接库的
分析:Clion里的MSVC配置那里Architecture 属性和qt下载下来的msvc的不符,找个可以运行的qt项目,照抄qt creator的配置就行
解决方法: Settings
-> Build, Execution, Deployment
-> Toolchains
里找到 MSVC 工具修改Architecture
:amd64
你可以打开Qt creator看一下对不对
error LNK2019: 无法解析的外部符号 _RTC_CheckStackVars,函数 main 中引用了该符号
main.cpp.obj : error LNK2019: 无法解析的外部符号 _RTC_CheckStackVars,函数 main 中引用了该符号
main.cpp.obj : error LNK2001: 无法解析的外部符号 _RTC_InitBase
main.cpp.obj : error LNK2001: 无法解析的外部符号 _RTC_Shutdown
main.cpp.obj : error LNK2001: 无法解析的外部符号 __CxxFrameHandler4
LINK : error LNK2001: 无法解析的外部符号 mainCRTStartup
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\kernel32.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\user32.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\gdi32.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\winspool.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\shell32.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\ole32.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\oleaut32.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\uuid.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\comdlg32.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Windows Kits\10\\lib\10.0.22000.0\\um\x86\advapi32.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\lib\x86\MSVCRTD.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\lib\x86\msvcprtd.lib : warning LNK4272:库计算机类型“x86”与目标计算机类型“x64”冲突
分析:使用了clion自动从vs里检测到的cmake,改成qt自己的就行
解决方法: Settings
-> Build, Execution, Deployment
-> Toolchains
里找到 MSVC 工具修改cmake
:...\Qt\Tools\CMake_64\bin\cmake.exe
Error running ‘Build’: Cannot start process, the working directory ‘…\cmake-build-debug-msvc’ does not exist
分析:使用了Ninja,虽然不知道为啥不能自动生成Debug输出文件
解决方法:File
-> Roload CMake Project
特殊技巧
添加动态库
先看这个:关于为什么我们不需要为Qt的库设置路径就可以使用动态库 - find_package与CMake如何查找链接库详解
咳咳,对于外部库用的还不多,我目前的做法是:
1. link_directories( 链接库的文件夹目录 )
# add_executable 在它俩中间 位置不可变
2. target_link_libraries( 链接库名 )
3. 把链接库拷贝到 cmake-build-debug(那个橙色文件夹) 的 根目录 下
主要注意的是:
如果使用的是MSVC,在Debug模式下,MSVC使用的库的后缀名都是-d.dll
,比如说使用Qt5Core,需要链接的是 Qt5Cored.dll
而不是 Qt5Core.dll
打开ui文件
Clion 打开Qt的ui文件
一个很久之前学到的小技巧,我忘了当时参照的是哪篇博客了,过程跟上面这个很像,不过现在没测试过是否成功