CMake 链接 Qt5::Svg 但 QImageReader 看不到

Posted

技术标签:

【中文标题】CMake 链接 Qt5::Svg 但 QImageReader 看不到【英文标题】:CMake link Qt5::Svg but not see by QImageReader 【发布时间】:2020-10-01 18:06:06 【问题描述】:

我最近更换了我的电脑(Windows 10),所以我重新安装了 CLion 和 Qt(使用 CMake 编译)。但是我的一个项目不再起作用了。

我已将 Qt5::Svg 添加到 CMake 中,它可以编译,但应用程序中没有出现 SVG。如果我尝试使用 QImageReader::supportedImageFormats(),则不会列出“SVG”。

我在构建目录中有 Qt5Svgd.dll。

这里是我的 CMake 配置:

cmake_minimum_required(VERSION 3.16)
project(NBTModifier)

set(CMAKE_CXX_STANDARD 20)

find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Svg REQUIRED)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

include_directories($CMAKE_BINARY_DIR)
add_executable(
    NBTModifier

    main.cpp
    MainWindow/MainWindow.ui MainWindow/MainWindow.h MainWindow/MainWindow.cpp

    icons/breeze.qrc icons/breeze-dark.qrc
)
target_link_libraries(NBTModifier Qt5::Widgets Qt5::Svg)

我错过了什么吗?

编辑:根据alexandre 的建议,我运行 DependencyWalker:我的“NBTModifier.exe”似乎不依赖于 Qt5Svgd.dll。它解释了为什么 QImageReader 不显示它。

那么为什么 CMake 不将 Qt5Svg 链接到我的应用程序?

【问题讨论】:

当您运行您的软件时,如果正确找到并加载了 SVG DLL,可能会检查 DependencyWalker(或 Depends)。 好建议。问题更新:DLL 未链接 【参考方案1】:

要在您的应用程序中显示 SVG 图像(即图标),您需要相应的 imageformat 插件,该插件正在运行时加载(这就是 DependenyWalker 不显示它的原因)。查看您的QTDIR/plugins/imageformats 目录,查找qsvg.dlllibqsvg.dll,如果需要,将其复制到您的运行时目录中。有关相应文档,请参阅https://doc.qt.io/archives/qt-5.11/windows-deployment.html#qt-plugins。

【讨论】:

Thanks, it works. Using theme system, i also add platformthemes` 和 iconengine。但是,我不明白为什么我以前的电脑不需要它们。 我猜你之前的系统 QTDIR 被添加到你的 PATH 中,所以即使它不在运行时目录中,你的可执行文件也会找到它。设置 Qt 开发环境并在 Windows 上运行 Qt 应用程序是边缘黑魔法,至少对我来说,作为一个 Unix/Linux 人......有关 dll 查找的更多详细信息,请参阅docs.microsoft.com/en-us/windows/win32/dlls/…

以上是关于CMake 链接 Qt5::Svg 但 QImageReader 看不到的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CMake 链接库?

CMAKE 库未链接

库中的 CMake 链接目录

使用特定链接器进行CMake交叉编译不会将参数传递给armlink

CMake:将第三方库链接到项目库

如何强制 CMake 链接到系统库而不是同名目标