Qt 5.6 LTS beta on Windows【環境変数 QT_QPA_PLATFORM_PLUGIN_PATH】

この記事は、
QtJP月例勉強会 (Nov21,2015)
https://qt-users.doorkeeper.jp/events/34217
での成果とその後の作業を、
三鷹PGCafe月例勉強会 (Jan09,2016)
https://atnd.org/events/73218
向けに書き起こしたものです。

作業は Windows 8.1 Pro Intel 64bit 版の上で行っています。
処理系は、Visual Studio 2015 Community を使っています。
https://www.visualstudio.com/post-download-vs?sku=community

# Qt 5.6 LTS とは
Qt 5.6 はQtの最新版で、2016年1月前半の時点ではbeta版に留まっています。今後RC版を経て、リリースに至ります。

Qt 5.6 は、Qtとして初めての Long Term Support バージョンとなります。
またWindows開発面からみると、Visual Studio 2015 が初めて公式にサポートされます。


***
**Qt の読みについて**
米国関係者の一部は”キューティー”と読んでいますが、公式には”キュート”です。混迷の読み問題に終止符を打つべく？2016年2月には発音記号ロゴの公式アパレルまで登場しました。
![1,width=300,height=300,appearanceId=2,version=1449056614.jpg](https://qiita-image-store.s3.amazonaws.com/0/81674/0ad814eb-1181-a326-a594-d40959671c06.jpeg)
***

# Qt 5.6 beta の現状
Qt 5.6 beta では、ソースコードといくつかのバイナリーコードが提供されています。Visual Studio 2015 （以降 VS14 と記載）用も64/32bit共に用意されています。

# ライセンスとダイナミックリンクの話
Qt では、三つの概念的ライセンス区分が示されています。

+ Commercial deployment
+ In-house deployment, private use, or student use
+ Open source distribution under a LGPL or GPL license

また実際のライセンス区分としては、二つの商用有償ライセンスと、一つの無償ライセンスが用意されています。

+ Qt for Application Development (Commercial)
+ Qt for Device Creation (Commercial)
+ Open Source

この記事では最後のオープンソースライセンスを用いますが、このライセンスでは実装にはダイナミックリンクを用いなければなりません。
iOSのようにスタティックリンクを要求されるケースでこのライセンスを用いると、全ソースコードの公開が前提となってしまいます。

この記事では、Windows環境にQt成果物をデプロイする際のダイナミックリンクに関する小ネタを扱っています。

# 使用したコードの入手先
+ cmake 3.4.1<br/>https://cmake.org/download/<br/><tab/>Windows Source と Windows Binary distributions (Win32 Installer)
+ Qt 5.6 beta<br/>https://download.qt.io/snapshots/qt/5.6/5.6.0-beta/latest_src/<br/>ソースコード qt-everywhere-opensource-src-5.6.0-beta.zip<br/>http://download.qt.io/development_releases/qt/5.6/5.6.0-beta/<br/>VS14バイナリー qt-opensource-windows-x86-msvc2015_64-5.6.0-beta.exe

# cmake を セルフブートしてみよう
cmake の最新版 3.4.1 ですが、Windows向けバイナリーは32bit版しか提供されていません。そしてGUIは Qt を使用しており、ドキュメントによると4系と5系のいずれでも良いとなっています。
ここでは cmake 32bit バイナリーを使って、cmake 64bit バイナリーを作成してみました。もちろん Qt は 5.6 beta のVS14バイナリーを使います。

## cmake-gui で cmakeソースコードを設定する
この図を参照して、Qtの参照先を設定してください。
（厳密にはこの図は Qt 5.6 beta を使った64bit版です。）
<img width="483" alt="cmakecmake.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/81674/4beeaf3b-b937-01f0-dbca-26ac74844f85.jpeg">

## Visual Studio 2015 でコンパイルリンク
CMake.sln ファイルが生成されていますので、これでVS14を起動します。
<img width="699" alt="cmakedir.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/81674/f79fd3ad-b3e7-76b2-cd12-9c1b0e5ae05e.jpeg">

ALL_BUILD を指定して、ビルドしてください、
<img width="385" alt="cmakeBuild.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/81674/1775845e-cd93-fddb-0910-f49c286b9684.jpeg">

0 faild で終了しましたか？

## 新しいロードモジュールを実行してみよう。
あれ？ どうも Qt のダイナミックライブラリーが見えていないようです。
<img width="243" alt="cmakeGUIerr.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/81674/8007134e-d345-4748-342a-16969f0ddf5d.jpeg">
（cmakeから提供されている32bitロードモジュールでは、Qtはスタティックリンクされているようです。）

## 解決策は
先のエラーダイアログを頼りに検索してみると、解決策として実行モジュールと同一ディレクトリにQtのダイナミックライブラリー群をコピーする....としている記述がほとんどです。それで解決するでしょうか？そもそもQtのダイナミックライブラリ群はちょっとした数とサイズなのですよ。

# Qt 5.6 beta のダイナミックリンクなロードモジュールをWindowsで実行するには
Qt 4系の QWS（Qt Window System）に換えて、Qt 5系では QPA（Qt Platform Abstraction）という環境依存部実装を使っています。Windowsでは、Windows用のQPAモジュールを指定してやらなければいけません。
コマンドラインのオプションでも指定できますが、現実的には QT_QPA_PLATFORM_PLUGIN_PATH という環境変数で指定することになります。msvc2015_64\plugins\platforms の場所を指定してください。
<img width="321" alt="QtEnv.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/81674/26eba9e8-e48b-1f32-fb1f-4e09dd9c1574.jpeg">

今度は無事実行できましたね？

# QT_QPA_PLATFORM_PLUGIN_PATH は誰が参照しているのか

ソースコードディレクトリの
qtbase\src\gui\kernel\qguiapplication.cpp
ファイル中の
QGuiApplicationPrivate::createPlatformIntegration()
で参照しています。

先のエラーダイアログは、同じファイルの
QGuiApplication::init_platform(....)
で出していました。

# Qt 5.6 beta が参照している環境変数は

特定組込環境でしか意味をなさないものや、OS環境既定のものも含めると、266もの環境変数を参照していました。なかには、実効性の無いものも含まれているかもしれません。また Qt Creator が参照する様な実行時ではなく開発時にQtツール群が参照する環境変数も多く含まれています。

## QPA に関する環境変数
+ QT_QPA_EGLFS_TSLIB
+ QT_QPA_EGLFS_WIDTH
+ QT_QPA_ENABLE_TERMINAL_KEYBOARD
+ QT_QPA_EVDEV_DEBUG
+ QT_QPA_EVDEV_KEYBOARD_PARAMETERS
+ QT_QPA_EVDEV_MOUSE_PARAMETERS
+ QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS
+ QT_QPA_FB_DISABLE_INPUT
+ QT_QPA_FB_HIDECURSOR
+ QT_QPA_FB_NO_LIBINPUT
+ QT_QPA_FB_TSLIB
+ QT_QPA_FONTDIR
+ QT_QPA_GENERIC_PLUGINS
+ QT_QPA_PLATFORM
+ QT_QPA_PLATFORM_PLUGIN_PATH
+ QT_QPA_PLATFORMTHEME
+ QT_QPA_UPDATE_IDLE_TIME
+ QT_QPA_VERBOSE

## QPA 以外のQt環境変数
+ NEMO_RESOURCE_CLASS_OVERRIDE
+ PULSE_GIT_BRANCH
+ PULSE_TESTR_BRANCH
+ Q_DBUS_BLOCKING_CALL_MAIN_THREAD_WARNING_MS
+ Q_DBUS_BLOCKING_CALL_OTHER_THREAD_WARNING_MS
+ QDBUS_DEBUG
+ QDECLARATIVELANGUAGE_UPDATEERRORS
+ QMAKE
+ QMAKEFLAGS
+ QMLSCENE_DEVICE
+ QMLSCENE_IMPORT_NAME
+ QSG_ANTIALIASING_METHOD
+ QSG_DISTANCEFIELD_ANTIALIASING
+ QSG_FIXED_ANIMATION_STEP
+ QSG_RENDER_LOOP
+ QSG_RENDERER_BUFFER_STRATEGY
+ QSG_RENDERER_DEBUG
+ QSG_SANITY_CHECK
+ QSG_VISUALIZE
+ QT_ACCEL_DATADIVISOR
+ QT_ACCEL_DELIMITER
+ QT_ACCEL_FILEPATH
+ QT_ANCHORLAYOUT_NO_SIMPLIFICATION
+ QT_ANGLE_PLATFORM
+ QT_AUTH_PASSWORD
+ QT_AUTH_URL
+ QT_AUTH_USER
+ QT_AUTO_SCREEN_SCALE_FACTOR
+ QT_BEARER_POLL_TIMEOUT
+ QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED
+ QT_COMPOSITOR_NEGATE_INVERTED_Y
+ QT_DBL_CLICK_DIST
+ QT_DEBUG_BACKINGSTORE
+ QT_DEBUG_FPS
+ QT_DEBUG_PLUGINS
+ QT_DEVICE_PIXEL_RATIO
+ QT_DIRECTFB_BLITTER_DEBUGPAINT
+ QT_DRAW_SCENE_ITEM_RECTS
+ QT_ENABLE_REGEXP_JIT
+ QT_EVENT_DISPATCHER_CORE_FOUNDATION
+ QT_EXCLUDE_GENERIC_BEARER
+ QT_FACEBOOK_ACCESS_TOKEN
+ QT_FILE_SELECTORS
+ QT_FLUSH_PAINT
+ QT_FLUSH_PAINT_EVENT
+ QT_FLUSH_UPDATE
+ QT_FONT_DPI
+ QT_GRAPHICSLAYOUT_DEBUG
+ QT_GSTREAMER_CAMERABIN_FLAGS
+ QT_GSTREAMER_CAMERABIN_SRC
+ QT_GSTREAMER_CAMERABIN_VIDEOSRC
+ QT_GSTREAMER_PLAYBIN_FLAGS
+ QT_GSTREAMER_USE_PLAYBIN_VOLUME
+ QT_GSTREAMER_WIDGET_VIDEOSINK
+ QT_GSTREAMER_WINDOW_VIDEOSINK
+ QT_HARFBUZZ
+ QT_HASH_SEED
+ QT_HAVE_TEST_FONTS
+ QT_IM_MODULE
+ QT_LABS_CONTROLS_STYLE
+ QT_LANCELOT_DIR
+ QT_LANCELOT_SERVER
+ QT_LAYOUT_DEBUG
+ QT_LOAD_TESTABILITY
+ QT_LOGGING_CONF
+ QT_LOGGING_RULES
+ QT_LOGGING_TO_CONSOLE
+ QT_MESSAGE_PATTERN
+ QT_NECESSITAS_COMPATIBILITY_LONG_PRESS
+ QT_NMEA_SERIAL_PORT
+ QT_NO_ANTIALIASING
+ QT_NO_CPU_FEATURE
+ QT_NO_FAST_MOVE
+ QT_NO_FAST_SCROLL
+ QT_NO_FT_CACHE
+ QT_NO_SUBTRACTOPAQUESIBLINGS
+ QT_ONSCREEN_PAINT
+ QT_OPENGL
+ QT_OPENGL_BUGLIST
+ QT_OPENGL_DLL
+ QT_PAN_TOUCHPOINTS
+ QT_PLUGIN_PATH
+ QT_PROXY_HOST
+ QT_PROXY_PASSWORD
+ QT_PROXY_PORT
+ QT_PROXY_USER
+ QT_QUICK_CONTROLS_STYLE
+ QT_QUICK_CORE_PROFILE
+ QT_SENSORS_LOAD_PLUGINS
+ QT_STYLE_OVERRIDE
+ QT_SUBPIXEL_AA_TYPE
+ QT_TEST_CI
+ QT_USE_ANDROID_NATIVE_DIALOGS
+ QT_USE_ANDROID_NATIVE_STYLE
+ QT_USE_NATIVE_WINDOWS
+ QT_USE_WINRT_NATIVE_DIALOGS
+ QT_VIDEONODE
+ QT_WAYLAND_CLIENT_BUFFER_INTEGRATION
+ QT_WAYLAND_DECORATION
+ QT_WAYLAND_DISABLE_WINDOWDECORATION
+ QT_WAYLAND_FORCE_DPI
+ QT_WAYLAND_IGNORE_BIND_DISPLAY
+ QT_WAYLAND_INPUTDEVICE_INTEGRATION
+ QT_WAYLAND_SERVER_BUFFER_INTEGRATION
+ QT_WAYLAND_SHELL_INTEGRATION
+ QT_WEBENGINE_USE_EXPERIMENTAL_SCREEN_CAPTURE
+ QT_WINVER_OVERRIDE （ヲイヲイ）
+ QT_XCB_GL_INTEGRATION
+ QT_XKB_CONFIG_ROOT
+ QT3DRENDER_DEBUG_LOGGING
+ QTCOMPOSE
+ QTEST_DISABLE_STACK_DUMP
+ QTEST_ENABLE_EXTRA_SELFTESTS
+ QTEST_EVENT_DELAY
+ QTEST_EXTERNAL_DEBUG
+ QTEST_EXTERNAL_RUN
+ QTEST_KEEP_IMAGEDATA
+ QTEST_KEYEVENT_DELAY
+ QTEST_MOUSEEVENT_DELAY
+ QTEST_SERIALPORT_RECEIVER
+ QTEST_SERIALPORT_SENDER
+ QTSCRIPT_TEST_CONFIG_DIR
+ QTSCRIPT_TEST_CONFIG_SUFFIX
+ QTSCRIPT_TEST_DIR
+ QTUBUNTU_ICON_THEME
+ QTUBUNTU_SWAPINTERVAL
+ QTWEBENGINE_REMOTE_DEBUGGING
+ QTWEBENGINEPROCESS_PATH
+ QV4_MM_MAX_CHUNK_SIZE
+ QV4_MM_MAXBLOCK_SHIFT
+ SHOW_EXIT_VALUE
+ STRESSDEBUG
+ tst_QProcess

## OSや処理系で規定されている環境変数
+ EGL_PLATFORM
+ EGLFS_X11_SIZE
+ ENGINIO_API_URL
+ ENGINIO_CREDENTIALS_FILE_PATH
+ ENGINIO_EMAIL_ADDRESS
+ ENGINIO_LOGIN_PASSWORD
+ LC_ALL
+ LC_CTYPE
+ LC_MEASUREMENT
+ LC_MESSAGES
+ LC_MONETARY
+ LC_NUMERIC
+ LC_TIME
+ BROWSER
+ DEFAULT_BROWSER
+ DESKTOP_SESSION
+ DESKTOP_STARTUP_ID
+ DISPLAY
+ DXSDK_DIR
+ DYLD_LIBRARY_PATH
+ GRID_UNIT_PX
+ IBUS_ENABLE_SYNC_MODE
+ KDE_SESSION_VERSION
+ KDEDIRS
+ KDEHOME
+ LANG
+ LD_LIBRARY_PATH
+ ORIENTATION
+ TZ
+ UNICODEMAP_JP
+ XCOMPOSEFILE
+ XCURSOR_SIZE
+ XCURSOR_THEME
+ XDG_CACHE_HOME
+ XDG_CONFIG_DIRS
+ XDG_CONFIG_HOME
+ XDG_CURRENT_DESKTOP
+ XDG_DATA_DIRS
+ XDG_DATA_HOME
+ XDG_RUNTIME_DIR
+ BT_TEST_DEVICE
+ DBUS_SESSION_BUS_ADDRESS
+ GIT_BRANCH
+ JAVA_HOME
+ JENKINS_HOME
+ PlatformToolset
+ QUERY_STRING
+ RESOURCE_NAME
+ SENSORLOG
+ TSLIB_TSDEVICE
+ XMLPATTERNSXQTS_TESTRANGE
+ ExtensionSdkDir
+ ProgramFiles
+ SystemDrive
+ SystemRoot
+ UCRTVersion
+ VCInstallDir
+ windir
+ WindowsSdkDir
+ all_proxy
+ ftp_proxy
+ http_proxy
+ https_proxy
+ no_proxy
+ APPDATA
+ COMPUTERNAME
+ COMSPEC
+ HOME
+ HOMEDRIVE
+ HOMEPATH
+ PATH
+ PATHEXT
+ PROMPT
+ TEMP
+ TMP
+ TMPDIR
+ USERPROFILE

## 組込み向けと思われる環境変数
+ MINISTRO_ANDROID_STYLE_PATH
+ MINISTRO_SSL_CERTS_PATH
+ NATIVEDEBUG
+ NATIVEDEBUGSPEED
+ QQNX_DISABLE_POWER_SAVE
+ QQNX_DISPLAY_DEPTH
+ QQNX_PHYSICAL_SCREEN_SIZE
+ QQNX_RENDERER_DEFAULT_AUDIO_SINK
+ QT_ANDROID_APP_ICON_SIZE
+ QT_ANDROID_DISABLE_GLYPH_CACHE_WORKAROUND
+ QT_ANDROID_FONT_LOCATION
+ QT_ANDROID_FONTS
+ QT_ANDROID_FONTS_MONOSPACE
+ QT_ANDROID_FONTS_SERIF
+ QT_ANDROID_MAX_ASSETS_CACHE_SIZE
+ QT_ANDROID_MAX_PREPOPULATED_ASSETS_CACHE_SIZE
+ QT_ANDROID_MINIMUM_MOUSE_DOUBLE_CLICK_DISTANCE
+ QT_ANDROID_RASTER_IMAGE_DEPTH
+ QT_ANDROID_THEME
+ QT_ANDROID_THEME_DISPLAY_DPI

# 参考文献
+ QPA(Qt Platform Abstraction) メモ<br/>http://qiita.com/maueki/items/7f9bec409c880550a0d3
+ Qt for Windows - Deployment<br/>http://doc.qt.io/qt-5/windows-deployment.html