qt5.15静态构建中的qmlsvg,使用CMake
我想从5.9迁移到5.15,但无法从QML加载svg。 原始版本使用Ubuntu(5.9)提供的qt,确实使用 没有额外的步骤。新构建使用静态Qt 我使用: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 \
- Ubuntu 18
- Qt 5.15的内部静态构建
- CMake(3.18)
./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)