使用 cmake (windows) 构建时不显示 Qt 资源
Posted
技术标签:
【中文标题】使用 cmake (windows) 构建时不显示 Qt 资源【英文标题】:Qt resources not displaying when building with cmake (windows) 【发布时间】:2020-05-17 09:18:04 【问题描述】:我有一个要迁移到 Cmake 的 Visual Studio Qt 解决方案。
一切都在编译并且工作正常,除了我在 *.qrc 文件中的所有图标(.png)根本不显示。
我的CMakeLists.txt
是 Qt 项目的标准配置:
...
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(SOURCE_FILES ...)
set(HEADER_FILES ...)
set(UI_FILES ...)
set(RESOURCE_FILES resources/res.qrc)
add_executable(project WIN32 $SOURCE_FILES $HEADER_FILES $UI_FILES $RESOURCE_FILES)
find_package(Qt5 REQUIRED COMPONENTS ...)
target_link_libraries(project PRIVATE Qt5::Core etc...)
我认为实际上所有图标都嵌入到了.exe中,因为:
1.如果我从qrc
文件中删除所有路径并重新编译,.exe大小会减少图标大小
2.我检查了AUTORCC
生成的qrc_*.cpp
,所有的图片都在那里。
但是当我使用这段代码 sn-p 迭代我的所有资源时
QDirIterator it(":", QDirIterator::Subdirectories);
while (it.hasNext())
qDebug() << it.next();
图标不存在。
我尝试了用qt5_add_resources()
代替AUTORCC
的替代方法,结果是一样的。
我还有所有的iconengines
、imageformats
、platforms
、styles
文件夹与 .exe 在同一路径上。
编辑:
将项目的整个Cmake
部分添加到github。
【问题讨论】:
您确定可以使用目录迭代器迭代资源吗?您是否尝试引用特定图标? 由于某种原因,您很可能错过了对Q_INIT_RESOURCE(res)
的呼叫。但您不应该这样做,因为等效代码位于生成的 cpp 文件的底部。所以除非你以某种方式拍摄你的静态初始化器,否则它永远不会丢失。
那么你只能尝试使用 Qt 的调试版本,并检查 Qt 发出的任何可能的警告。分别调试到 Qt 本身。如果该调用有效(已编译),则不是链接器问题,并且加载代码的资源确实是可执行文件的正确部分
qrc_*.cpp 文件是 Visual Studio 解决方案的一部分吗?
另外,您使用的是什么版本的 CMake?
【参考方案1】:
考虑到我们在您的帖子评论中进行的讨论,CMake
按预期工作,资源已加载到您的应用程序中。
正如您提到的“当我从 clion 运行我的应用程序时,它会显示图像。如果我将 exe 复制到带有 *.dll 等的文件夹中,它不会。”,所以:
复制时有些文件丢失了,你应该尝试使用windeployqt
来正确复制运行时需要的东西
或者问题来自qrc的加载方式,那么,我建议你调试qrc_*.cpp文件的内容(你可以在你复制到clion之后调试它)看看为什么加载资源失败
无论如何,这看起来更像是部署问题,而不是配置/编译问题。
【讨论】:
以上是关于使用 cmake (windows) 构建时不显示 Qt 资源的主要内容,如果未能解决你的问题,请参考以下文章
使用 CMake 在 Windows 10 上构建 uWebSockets
制作 | UWP :: 使用 Cmake 构建通用 Windows 应用程序
在使用 CMake 构建 Windows DLL 期间运行单元测试
使用 CMake、Clang 和 Ninja 在 Windows 上构建 c++ 项目