Qt Clion CMake 项目无法定位 qwindowsvistastyle.dll
本文最后更新于:2024年12月22日 凌晨
前情提要
众所周知,Qt6
已经开始慢慢抛弃qmake
了,开始皈依cmake
而且宇宙第一IDE - Clion
,也是不支持qmake
所以,我们在Clion
上只能采用cmake
编译Qt
项目
但是,很快我们就会发现,运行后的窗体非常地old fashion
这是为什么捏?
其实就是找不着qwindowsvistastyle.dll
该文件位于D:\Qt\5.15.2\msvc2019_64\plugins\styles
(Qt安装目录的plugins
目录下)
其实我们可以发现Clion
自动生成的CMakeLists.txt
把"${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
复制到了exe目录下
1 |
|
但却没有理睬qwindowsvistastyle.dll
(可能是因为这不是必须文件吧)
修正:注意,Clion生成的针对Qt6的模板已经包含了这个dll
怎办
默认情况下,Windows
系统会按以下顺序查找 DLL 文件:
- 可执行文件所在的目录。
- 系统目录(如
C:\Windows\System32
)。 - 当前工作目录。
- 环境变量
PATH
指定的目录。
其实手动地复制一下就可以了(可执行文件所在目录)
注意路径是style\qwindowsvistastyle.dll
or plugins\style\qwindowsvistastyle.dll
但是知其然而不知其所以然
为什么qmake
编译的exe
就可以正确定位该dll
位置(not .lib
)呢(即便我没有设置plugins的环境变量)
合理的推测是,在编译期将dll搜索目录写入了exe
但貌似cmake
无法做到这一点(on Windows)?
[windows] cmake 如何设置 需要使用的 dll_cmake添加dll-CSDN博客
qmake
和cmake
最终生成的都是Makefile
,没道理出现这样的能力差异
Qt Creator CMake vs Clion CMake
而且而且,使用Qt Creator
创建的CMake
项目,是可以正确找到plugins
文件夹的!
aaaaaaa
仙人指路
Qt官方文档指出:
在 Qt 中,当应用程序启动时,应用程序的可执行目录是 Qt 搜索插件的基本目录。
Qt 还会查找QLibraryInfo::path ( QLibraryInfo::PluginsPath ) 指定的目录,该目录通常位于
QTDIR/plugins
中;QTDIR
是Qt的安装目录。如果您希望 Qt 查看其他位置,您可以通过调用QCoreApplication::addLibraryPath () 添加所需数量的路径。如果你想设置自己的路径,你可以使用QCoreApplication::setLibraryPaths ()。或者,您可以使用
qt.conf
文件来覆盖编译到 Qt 库中的硬编码路径。有关更多信息,请参阅使用 qt.conf 。另一种可能性是在运行应用程序之前设置
QT_PLUGIN_PATH
环境变量;可以使用系统路径分隔符分隔多个路径。设置后,Qt 在此变量中指定的路径中查找插件。注意:请勿将
QT_PLUGIN_PATH
导出为系统范围的环境变量,因为它可能会干扰其他 Qt 安装
通过qApp->libraryPaths()
,我们可以观察在不同编译系统下dll的搜索路径
qmake & Qt Creator cmake:
1 |
|
Clion cmake:
1 |
|
The default path list consists of a single entry, the installation directory for plugins. The default installation directory for plugins is INSTALL/plugins, where INSTALL is the directory where Qt was installed.
我们可以发现,在默认情况下,qmake的行为与官方文档一致,返回了 Qt安装目录下的plugins
目录 & 可执行文件所在目录
但是cmake却返回了可执行文件目录下的plugins
文件夹,这是为什么!
// 这也解释了前文说,为什么style\qwindowsvistastyle.dll
or plugins\style\qwindowsvistastyle.dll
都可以
好吧,也许Qt
自己知道自己在哪里($QTDIR
),而Clion
不知道?
aaaaaa
Temp Solution
好吧,寄了,世界十大未解之谜
那么想要在Clion
开发Qt
怎么办捏
手动复制
plugins\style\qwindowsvistastyle.dll
使用
CMakeLists.txt
自动化复制使用
qt.conf
(最好放入资源文件嵌入exe)使用
QCoreApplication::addLibraryPath
添加plugins
目录在
Clion
的运行配置中设置局部环境变量QT_PLUGIN_PATH
(这样只会影响Clion
的开发,不会影响全局)这个比较好,这样还可以删掉
CMakeLists.txt
中拷贝dll
的部分
当然,这些都是开发配置,对于项目发布,那肯定是要使用windeployqt.exe
工具拷贝所有dll
的
详情请参见:Qt-windeployqt部署发布浅谈 - MrBeanC-Blog (cls.ink)
Peace
我焯,等一下
我突然发现,用Qt Creator
创建的cmake
项目,用Clion
打开之后是可以正确搜索到plugins
目录的
但是qDebug()
就无法正常输出了,加上QT_ASSUME_STDERR_HAS_CONSOLE=1
之后,也只能在debug
模式输出
而std::cout
也只能在debug
模式输出,aaaaa
Conclusion
CMake太恐怖了
补充:
真相了,默认情况下CMake
项目生成的exe
直接打开是包含命令行窗口的
需要加上set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE true)
才能消除
Qt
默认加上了这一行
但是这样做Clion
就无法捕获输出了
所以最好是只在Release
模式下加上这一行
1 |
|
控制台意外换行 & 颜色
同时由于Clion
貌似是直接1:1镜像了控制台中输出的内容
导致其甚至包括原本控制台宽度不够造成的额外换行
听说qDebug()
默认是输出到stderr
,所以Clion中显示的是红色的输出,非常刺眼
那么如何解决以上两个问题呢?
其实只要开启一个设置即可:在输出控制台中模拟终端
这样,Clion
的输出就完全正常了,无论是换行,还是颜色
等一下,兄弟们,再等一下
我又有新发现了
实际上的规则是:
如果可执行文件(exe)目录下存在Qt5Core.dll
/Qt5Cored.dll
,那么exe
就会在本目录下搜索plugins
且qApp->libraryPaths()
也会是本目录下的plugins
但是,假如在exe同目录下没有Qt5Core.dll
/Qt5Cored.dll
,就会自动从Qt
安装目录下搜索正确的plugins
下的dll
且qApp->libraryPaths()
也会变成"D:/Qt/5.15.2/msvc2019_64/plugins"
,离子谱
WTF,Core是定位符吗?
所以实际上正确的处理方案是,删除Clion
自动生成的CMakeLists.txt
中的dll
复制部分的代码
1 |
|
aaaaaaaa
Ref
[windows] cmake 如何设置 需要使用的 dll_cmake添加dll-CSDN博客
c++ - Qt GUI主题看起来过时 - VoidCC — c++ - Qt GUI theme looks old-fashioned - Stack Overflow
使用 CLion 開發 Qt5. Build with CLion 2021.1 11.0.10 & Qt… | by Weikeup | Medium