Unable to run QT Quick application built with CMake and static linking of QT libraries in Visual Studio
-
wrote on 10 Mar 2015, 17:53 last edited by
Hi,
I am working on a project where I use CMake to build the projects. I normally use Visual Studio for development. The project consist of multiple software components that shall run on multiple platforms. The GUI applications should also be able to run on multiple platforms where Windows, OSX, Android and IOS would be the important one.I would like to do this with a static build, but I have not been able to get it to work. I think I have exhausted my web search capabilities. I have made a simple example that illustrates the problem and the closest I could come to get something working.
I have simple qml file main.qml, I have a main.cpp that looks like this:
#include <QApplication> #include <QQmlApplicationEngine> #include <QtPlugin> #ifdef USE_STATIC_QT Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) #include <QQmlExtensionPlugin> Q_IMPORT_PLUGIN(QtQuick2Plugin) Q_IMPORT_PLUGIN(QtQuickControlsPlugin) #endif int main(int argc, char *argv[]) { QApplication app(argc, argv); QQmlApplicationEngine engine; #ifdef USE_STATIC_QT //Without these lines I get: QQmlApplicationEngine failed to load component qrc : / main.qml : 1 module "QtQuick" plugin "qtquick2plugin" not found QObject * plugin = qt_static_plugin_QtQuick2Plugin().instance(); QQmlExtensionPlugin* extensionPlugin = qobject_cast<QQmlExtensionPlugin*>(plugin); //This returns NULL extensionPlugin->registerTypes("QtQuick"); #endif engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); }
My CMakeList.txt looks like this:
cmake_minimum_required(VERSION 2.8.3) project(StaticQmlCMake) cmake_policy(SET CMP0020 NEW) ADD_DEFINITIONS(-DUNICODE) ADD_DEFINITIONS(-D_UNICODE) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) find_package(Qt5Quick REQUIRED) find_package(Qt5Qml REQUIRED) find_package(OpenGL REQUIRED) find_package(Qt5Widgets REQUIRED) qt5_add_resources(RESOURCES qml.qrc) add_executable(StaticQmlCMake WIN32 main.cpp ${RESOURCES}) if(USE_STATIC_QT) find_library(HARFBUZZLIB_REL qtharfbuzzng) find_library(HARFBUZZLIB_DEB qtharfbuzzngd) set(HARFBUZZLIB optimized ${HARFBUZZLIB_REL} debug ${HARFBUZZLIB_DEB}) find_library(QT5PLATFORMSUPPORT_REL Qt5PlatformSupport) find_library(QT5PLATFORMSUPPORT_DEB Qt5PlatformSupportd) set(QT5PLATFORMSUPPORT optimized ${QT5PLATFORMSUPPORT_REL} debug ${QT5PLATFORMSUPPORT_DEB}) get_target_property(QtQuick2PluginLoc Qt5::QtQuick2Plugin LOCATION) get_filename_component(PLUGINPATH ${QtQuick2PluginLoc} DIRECTORY) set(QMLDBGTCP optimized "${PLUGINPATH}/qmldbg_tcp.lib" debug "${PLUGINPATH}/qmldbg_tcpd.lib") get_filename_component(PLUGINPATH ${PLUGINPATH} DIRECTORY) if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") set(PLATFORMLIB optimized "${PLUGINPATH}/platforms/qwindows.lib" debug "${PLUGINPATH}/platforms/qwindowsd.lib" imm32.lib winmm.lib Ws2_32.lib) endif() get_filename_component(QMLPATH ${PLUGINPATH} DIRECTORY) set(QMLPATH "${QMLPATH}/qml") set(QTQUICK_CONTROLS_PLUGIN optimized "${QMLPATH}/QtQuick/Controls/qtquickcontrolsplugin.lib" debug "${QMLPATH}/QtQuick/Controls/qtquickcontrolsplugind.lib") set(STATIC_QT_LIBRARIES ${HARFBUZZLIB} ${QT5PLATFORMSUPPORT} Qt5::QtQuick2Plugin ${QTQUICK_CONTROLS_PLUGIN} ${QMLDBGTCP} ${PLATFORMLIB}) ADD_DEFINITIONS(-DUSE_STATIC_QT) endif() target_link_libraries(StaticQmlCMake Qt5::Gui Qt5::Widgets Qt5::Core Qt5::Qml Qt5::Quick ${OPENGL_LIBRARIES} ${STATIC_QT_LIBRARIES})
I built QT static with msvc compiler and used the following configuration:
configure -c++11 -mp -debug-and-release -static -nomake tests -nomake examples -prefix C:\Qt\Qt5.4.1\5.4\msvc2013-compact-static-x86 -platform win32-msvc2013 -opengl desktop -no-icu -skip webkitI have the problem that qtquick2plugin is not loaded and after searching the web and this forum I found some solution where one should add the following line of code:
qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuick2Plugin().instance())->registerTypes("QtQuick");
This does not seem to work for me and cast operation fails.
So what am I doing wrong?
The example project can be downloaded here -
wrote on 11 Mar 2015, 09:56 last edited by PeJo 3 Nov 2015, 09:59
It seems like the parts of the CMakeList.txt file are missing in my previous post because I put it in a code block.
So her it is again:cmake_minimum_required(VERSION 2.8.3)
project(StaticQmlCMake)cmake_policy(SET CMP0020 NEW)
ADD_DEFINITIONS(-DUNICODE)
ADD_DEFINITIONS(-D_UNICODE)set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5Quick REQUIRED)
find_package(Qt5Qml REQUIRED)
find_package(OpenGL REQUIRED)
find_package(Qt5Widgets REQUIRED)qt5_add_resources(RESOURCES qml.qrc)
add_executable(StaticQmlCMake WIN32 main.cpp ${RESOURCES})
if(USE_STATIC_QT)
find_library(HARFBUZZLIB_REL qtharfbuzzng)
find_library(HARFBUZZLIB_DEB qtharfbuzzngd)
set(HARFBUZZLIB optimized ${HARFBUZZLIB_REL} debug ${HARFBUZZLIB_DEB})find_library(QT5PLATFORMSUPPORT_REL Qt5PlatformSupport)
find_library(QT5PLATFORMSUPPORT_DEB Qt5PlatformSupportd)
set(QT5PLATFORMSUPPORT optimized ${QT5PLATFORMSUPPORT_REL} debug ${QT5PLATFORMSUPPORT_DEB})get_target_property(QtQuick2PluginLoc Qt5::QtQuick2Plugin LOCATION)
get_filename_component(PLUGINPATH ${QtQuick2PluginLoc} DIRECTORY)
set(QMLDBGTCP optimized "${PLUGINPATH}/qmldbg_tcp.lib" debug "${PLUGINPATH}/qmldbg_tcpd.lib")
get_filename_component(PLUGINPATH ${PLUGINPATH} DIRECTORY)if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set(PLATFORMLIB optimized "${PLUGINPATH}/platforms/qwindows.lib"
debug "${PLUGINPATH}/platforms/qwindowsd.lib"
imm32.lib
winmm.lib
Ws2_32.lib)
endif()get_filename_component(QMLPATH ${PLUGINPATH} DIRECTORY)
set(QMLPATH "${QMLPATH}/qml")
set(QTQUICK_CONTROLS_PLUGIN optimized "${QMLPATH}/QtQuick/Controls/qtquickcontrolsplugin.lib" debug "${QMLPATH}/QtQuick/Controls/qtquickcontrolsplugind.lib")set(STATIC_QT_LIBRARIES ${HARFBUZZLIB} ${QT5PLATFORMSUPPORT} Qt5::QtQuick2Plugin ${QTQUICK_CONTROLS_PLUGIN} ${QMLDBGTCP} ${PLATFORMLIB})
ADD_DEFINITIONS(-DUSE_STATIC_QT)
endif()target_link_libraries(StaticQmlCMake Qt5::Gui Qt5::Widgets Qt5::Core Qt5::Qml Qt5::Quick ${OPENGL_LIBRARIES} ${STATIC_QT_LIBRARIES})
-
wrote on 12 Mar 2015, 10:09 last edited by
For some reason things disappear after the dollar signs in my posts so if you are interested in helping and need the CMakeList.txt file, you need to download the project from the link in my first post.
1/3