qt5.15静态构建中的qmlsvg,使用CMake

qt5.15静态构建中的qmlsvg,使用CMake,qt,svg,cmake,Qt,Svg,Cmake,我想从5.9迁移到5.15,但无法从QML加载svg。 原始版本使用Ubuntu(5.9)提供的qt,确实使用 没有额外的步骤。新构建使用静态Qt 我使用: Ubuntu 18 Qt 5.15的内部静态构建 CMake(3.18) 构建Qt ./configure \ -confirm-license \ -release \ -static \ -no-pch \ -nomake tests \ -nomake examples \

我想从5.9迁移到5.15,但无法从QML加载svg。 原始版本使用Ubuntu(5.9)提供的qt,确实使用 没有额外的步骤。新构建使用静态Qt

我使用:

  • Ubuntu 18
  • Qt 5.15的内部静态构建
  • CMake(3.18)
构建Qt

 ./configure \
    -confirm-license \
    -release \
    -static \
    -no-pch \
    -nomake tests \
    -nomake examples \
    -nomake tools \
    -nomake examples \
    -nomake tests \
    -skip qtdoc \
    -skip wayland \
    -skip qtwebengine \
    --prefix=/opt/Qt-5.15.0
CMake

cmake_minimum_required(VERSION 3.18)
project(test VERSION 0.0.0 LANGUAGES CXX)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt5 5.15 
    PATHS /opt/Qt-5.15.0
    COMPONENTS
        Core
        Widgets
        Qml
        Svg
        Quick
        QuickControls2
        Charts
        Multimedia
        LinguistTools
        QmlImportScanner 
        Xml
    REQUIRED QUIET
)

add_executable(test_qt

    # c++ code files
    main.cpp

    # qml code files
    qml/Main.qml

    # resource files
    qml/resources.qrc
)

target_include_directories(test_qt PRIVATE ${CMAKE_CURRENT_LIST_DIR})

target_link_libraries(test_qt 
    PRIVATE
        Qt5::Widgets
        Qt5::Qml
        Qt5::Quick
        Qt5::QuickControls2
        Qt5::Svg
        Qt5::Xml
        Qt5::Gui
)

qt_import_qml_plugins(test_qt
    INCLUDE 
        Qt5::QtQuick2Plugin
        Qt5::QSvgPlugin
        Qt5::QtQuickControls2Plugin
)
main.cpp

#include <QGuiApplication>
#include <QObject>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include <QQmlContext>

int main(int argc, char *argv[]) {
    int status = 0;

    try {

        QGuiApplication       app(argc, argv);
        QQmlApplicationEngine engine;

        engine.load(QUrl("qrc:/Main.qml"));

        QObject::connect(&engine, &QQmlApplicationEngine::quit, &QGuiApplication::quit);

        if (engine.rootObjects().isEmpty())
            return -1;

        status = app.exec();

    } catch (std::exception &) {
        return -1;
    }

    return status;
}
我省略了资源文件,但它列出了qml、png和svg文件。 成功加载使用PNG图像时,但使用SVG时,会出现以下错误:
qrc:/Main.qml:13:5:qml-Image:错误解码:qrc:/Image.svg:不支持的图像格式

当前Qt构建包含以下与SVG处理相关的文件:

./lib/libQt5Svg.a
./lib/libQt5Svg.la
./lib/cmake/Qt5Svg
./lib/cmake/Qt5Svg/Qt5SvgConfigVersion.cmake
./lib/cmake/Qt5Svg/Qt5SvgConfig.cmake
./lib/cmake/Qt5Gui/Qt5Gui_QSvgIconPlugin.cmake
./lib/cmake/Qt5Gui/Qt5Gui_QSvgPlugin_Import.cpp
./lib/cmake/Qt5Gui/Qt5Gui_QSvgIconPlugin_Import.cpp
./lib/cmake/Qt5Gui/Qt5Gui_QSvgPlugin.cmake
./lib/pkgconfig/Qt5Svg.pc
./lib/libQt5Svg.prl
./include/QtSvg
./include/QtSvg/QGraphicsSvgItem
./include/QtSvg/5.15.0/QtSvg
./include/QtSvg/QSvgRenderer
./include/QtSvg/QSvgWidget
./include/QtSvg/QSvgGenerator
./include/QtSvg/QtSvg
./include/QtSvg/QtSvgVersion
./include/QtSvg/QtSvgDepends
编辑

我将缺少的Svg库依赖项添加到find_package命令中。这个问题仍未解决


如果我针对Qt库的共享构建进行链接,则此项目可以正常工作。

您使用的是cmake,但在qmake.pro项目中,使用静态链接,您可以 必须加上

QT+=svg

请注意,svg插件依赖于多个小部件:

“QT+=svg”与“QT+=svg小部件”相同

在android/IOS中,最好跳过svg图像以减小应用程序大小

/opt/Qt/5.15.1/gcc_64/lib$ ldd libQt5Svg.so
    linux-vdso.so.1 (0x00007fff7bff0000)
    libQt5Widgets.so.5 => /opt/Qt/5.15.1/gcc_64/lib/./libQt5Widgets.so.5 (0x00007ff0cbf55000)
    libQt5Gui.so.5 => /opt/Qt/5.15.1/gcc_64/lib/./libQt5Gui.so.5 (0x00007ff0cb624000)
您可以尝试在您的Me.CPP中添加一些C++ Qtvg代码,以测试链接


谢谢您的时间,但我特别询问了有关此问题的CMake解决方案。是的,但我在使用静态win32 Qt构建时遇到了此问题。同样的错误,用QT+=svg解决。我想您应该添加“Svg”来查找程序包功能:查找程序包(Qt5 5.15路径/opt/Qt-5.15.0组件核心部件Qml Quick QuickControls2图表多媒体语言工具QmlImportScanner Xml Svg需要安静)我更新了代码,正如您所提到的,find_package命令中缺少Svg。尽管如此,该程序还是针对Qt5::Svg进行了链接(这意味着找到并使用了该库)。尝试添加到main.cpp#include和Q#u IMPORT_插件(QSvgIconPlugin);Q_导入_插件(QSvgPlugin);在主功能区,谢谢米格尔,我也试过沿着那条路走。当不在代码或cmake中声明插件时。该应用程序不会加载,会让我知道插件丢失。你知道我是否必须在CGub和C++中声明插件?
/opt/Qt/5.15.1/gcc_64/lib$ ldd libQt5Svg.so
    linux-vdso.so.1 (0x00007fff7bff0000)
    libQt5Widgets.so.5 => /opt/Qt/5.15.1/gcc_64/lib/./libQt5Widgets.so.5 (0x00007ff0cbf55000)
    libQt5Gui.so.5 => /opt/Qt/5.15.1/gcc_64/lib/./libQt5Gui.so.5 (0x00007ff0cb624000)