使用 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 的替代方法,结果是一样的。 我还有所有的iconenginesimageformatsplatformsstyles 文件夹与 .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++ 项目

使用 CMake 在面向 Linux 的 Windows 下跨平台构建

在 Windows 上使用 CMake 构建 open62541 失败