つまり、Qtを* .dllライブラリから切り離すことから始めます。 操作済み: Qt-windows-x86-MinGW-5.5.0-rc、2015.06.17からのスナップショット95 作業環境: Windows 8.1
そのような記事のかなりの数がすでに収集されていることを知っていますが、どうすればよいですか...彼が収集したdllが必要に応じてロードされ始める前に、Qtの異なるバージョンを4回再構築しなければなりませんでした。 このアセンブリでQtWebKitが削除されることをすぐに警告します。 すでに静的なQtビルドをお持ちの場合は、このマニュアルを最も興味深いものに自由に切り替えてください。
それでは始めましょう!
- 必要なソフトウェアセットをダウンロードします。
- 実際、 Qt 5.5.0-rc自体 ( このリンクがバージョン5.5.0の公式リリース後も存続するとは言えません )
- Qt-src-5.5.0-rc
- Perl ( ビルド時のバージョン: 5.22.0.1 )
- Python ( 3.4.3 )
- ルビー ( 2.2.2 )
PythonとRubyはまったく必要ないかもしれませんが、 すべてのマニュアルで、それらは両方とも「必須」と表示されており、サプライズは絶対に必要ありません。インストールします。
- 任意のディレクトリにインストール/アンパックします。 QtとそのソースにはC:/ Qtを、残りのソフトウェアにはC:/ devを用意しました。 Qtをインストールするとき、 Qt->ツール-> MinGWチェックボックスをチェックすることを忘れないでください。
インストール構成
ソースコンポーネントをインストールする必要はありません。アーカイブに個別にダウンロードしました(おそらく既に解凍されていますか?)。そして、それらを操作します。
樹木- C:/ dev / StrawberryPerl
- C:/ dev / Ruby22
- C:/ dev / Python34
- C:/Qt/Qt5.5.0-インストールされているQtのバージョン
- C:/Qt/qt-everywhere-opensource-src-5.5.0-rc-展開されたソース
- qmake構成を編集します。
- qt-everywhere-opensource-src-5.5.0-rc / qtbase / mkspecs / win32-g ++ / qmake.confファイルを開きます
- 私たちは線を見つけます
QMAKE_LFLAGS =
それを次のものに置き換えます
QMAKE_LFLAGS = -static -static-libgcc
qmldebuggerの謎のバグ
新しいバージョンでは無関係です。この手順をスキップしてください
lib\libQt5Qml.a(qqmldebugserver.o):qqmldebugserver.cpp: undefined reference to `QTcpServerConnection::QTcpServerConnection()'
修正します実際、このバグのために、インターネットで問題の説明を見つけるまで、Qtの4つのバージョンのうち2つを収集する必要がありました。 残念ながら、このパッチがどの場所にパッチを適用すべきかをまだ理解できていなかったので(教えていただければ嬉しいです)、私は非常に根本的かつい行動をとりました。問題の原因をソースから裏切りました。 私はそのような行為を実践する価値はないと思いますが、一度できたら=)
追伸:この変更と同時に、コレクターに-qml-debugパラメーターを追加したため、これが最終的に時間と神経を節約したのかどうかはわかりません 。 チャンスをつかんで時間を犠牲にしたい場合は、ソースを変更せずに、 -qml-debugパラメーターを使用してアセンブリーを構成してください。問題は無関係になります。
ディレクトリqt-everywhere-opensource-src-5.5.0-rc \ qtdeclarative \ src \ qml \ debuggerに移動し 、不運なファイルqqmldebugserver.cppを開き、好ましくない行にコメントします。
#if defined(QT_STATIC) && ! defined(QT_NO_QML_DEBUGGER) // #include "../../plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h" <---- #endif
- MinGWターミナルを起動する
スタート->すべてのプログラム-> Qt 5.5.0-> 5.5-> MinGW
そして彼にこのような何かを与えます:
# ! set QTSRC=C:\Qt\qt-everywhere-opensource-src-5.5.0-rc set MINGWPATH=C:\Qt\Qt5.5.0\Tools\mingw492_32\bin set QTPREFIX=C:\Qt\5.5.0_Static set PYPATH=C:\dev\Python34 set PERLPATH=C:\dev\Strawberry\perl\bin set RUBYPATH=C:\dev\Ruby22\bin
ここで:
QTSRC-アンパックされた Qt ソース
MINGWPATH -QtとともにインストールされたMinGWへのパス
QTPREFIX -Qt静的アセンブリがインストールされる場所
PYPATH-インストールされたPythonへのパス
PERLPATH -Pearl binフォルダーへのパス
RUBYPATH -Ruby binフォルダーへのパス
さらに:
set QTDIR=%QTSRC%\qtbase set PATH=%PATH%;%MINGWPATH%;%PYPATH%;%PERLPATH%;%RUBYPATH%;%QTDIR%/bin cd %QTSRC% mkdir nomake move qtwebkit nomake move qtwebkit-examples nomake
ここにバイナリ検索パスが設定され、最後の3行でWebKitがアセンブリからカットされます (-no-webkitフラグは構成ファイルのどこかで消えました)。 タンバリンなしでプラグインを接続するには、qtbaseのみを収集するだけでは不十分であるため、ソース%QTSRC%のフォルダーに移動し、そこにあるすべてのものを収集します。
- コンフィギュレーターを起動します。
configure -static -release -opensource -confirm-license -opengl desktop -no-angle -qml-debug -c++11 -platform win32-g++ -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -no-openssl -make libs -make tools -nomake examples -nomake tests -prefix %QTPREFIX%
ショタコエ?- -static-コメントなし。
- -release-リリースバージョンのみを収集することを示します(デバッグが必要な場合は-debugに変更します )。
- -opensource -confirm-license-ライセンスに同意します。
- - 「デスクトップ」用のopenglデスクトップアセンブリ。
- -no- angle-「libEGL、libGLESを削除します」、ありがとうTaraflex : Toster ;
- -qml-debug-積雲のデバッグを有効にします。 qmldebuggerでbajigを治療するまさにそのパラメーターが可能です (ポイント4)。
- -c ++ 11-...-使用を許可します。
- -platform win32-g ++ -ターゲットプラットフォーム( はい、32ビットのみ );
- -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -buns;
- -no-openssl -sslを無効にします(必要ありませんでした)。
- -make libs-これは、dllライブラリを構築するのに役立ちます。
- -make tools-疑わしい必要性のあるユーティリティ、それでも私はそれを残すことにしました。 アシスタント、デザイナー、言語学者のようです。 これが必要ない場合は、 -nomake toolsに置き換えてください 。
- -nomakeの例-nomakeテスト -例とテスト。 それらは非常に長く続くので、電源を入れない方が良いです。
- -prefix%QTPREFIX% -将来のアセンブリのインストール先を指定します。 ( %QTPREFIX%は、5番目の段落の最初に設定されました);
- sqliteなどの他のモジュールが必要な場合は、 READMEを読むか、 configure -helpコマンドを使用して、 コンフィギュレーターに追加する必要があるパラメーターを見つけてください。
- アセンブリを開始します。
mingw32-make -k
psマルチコアプロセッサを使用している場合は、パラメータ-j [ number of cores -1 ] を使用してコレクタに番号を通知する必要があります。 つまり 4コアプロセッサの場合、次のようにビルダーを実行しました。
mingw32-make -k -j3
パラメーター-kの種類は、「何かがうまくいかなかった」場合に停止するようコレクターに指示します。 この不快な状況は私に影響を与えなかったので、私は議論しません。
- インストールを開始します。
mingw32-make install
その後、収集したライブラリを含む%QTPREFIX%ディレクトリが必要です。
- 静的を構築するためのキットを追加します。
- Qt5.5.0-rcとともにインストールされたQtCreatorを実行します
- [ ツール ]タブ> [オプション... ] > [ビルドと実行]> [Qtバージョン ]に移動し、 %QTPREFIX% \ 5.5.0 \ binディレクトリから新しいqmakeを追加し、次のように呼び出します: " Qt%{Qt:Version}(%{Qt:バージョン} _Static) 「そして、「 適用 」ボタンをクリックします
Qtバージョン
- 「 キット 」タブに移動して「 追加 」をクリックし、「 Qt5.5.0-Static 」、コンパイラー: MinGW 、プロファイル:「 Qt%{Qt:Version}(%{Qt:Version} _Static)のように呼び出します 。 「 OK 」 ボタンをクリックします
キット
実際、それがすべてです。 そして今、最後に、 最も興味深い 。
QtQuickモジュールを使用したDLLライブラリの静的アセンブリ
QtCreator'eで新しいプロジェクトを作成します。
- ファイル>プロジェクトの作成...>ライブラリ> C ++ライブラリ>動的ライブラリ
- 作成したビルドキットを選択します( Qt5.5.0-Static )
- ファイル%project-name% _global.hを開きます
dllライブラリが静的に収集されなかった( より正確には収集されたが、動作しなかった)という事実のすべては、DLL( lib )の構築に使用されたテンプレート( TEMPLATE )にプラグインのリンクが含まれていないことでした。 したがって、それらはすべてヘッダーと.pro-fileに手動で書き込む必要があります 。
必要なすべてのプラグインのリストを取得するのは簡単でした。
- 新しいプロジェクト「 Qt Quick Application 」を作成します
- 同じQt5.5.0-Staticキットでコンパイルします( アセンブリタイプReleaseを指定することを忘れないでください )
- アセンブルされたプロジェクトがあるディレクトリに移動します: build- %project_name% -Qt5.5.0_Static-Releaseと2つのファイルを確認します。
- %project_name% _plugin_import.cpp
- %project_name% _qml_plugin_import.cpp
これらには、通常のQmlアプリケーション用にロードされたすべてのプラグインのリストが含まれています。
#include <QtPlugin> Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) Q_IMPORT_PLUGIN(QDDSPlugin) Q_IMPORT_PLUGIN(QICNSPlugin) Q_IMPORT_PLUGIN(QICOPlugin) Q_IMPORT_PLUGIN(QJp2Plugin) Q_IMPORT_PLUGIN(QMngPlugin) Q_IMPORT_PLUGIN(QTgaPlugin) Q_IMPORT_PLUGIN(QTiffPlugin) Q_IMPORT_PLUGIN(QWbmpPlugin) Q_IMPORT_PLUGIN(QWebpPlugin) Q_IMPORT_PLUGIN(QtQuick2Plugin) Q_IMPORT_PLUGIN(QTcpServerConnection) Q_IMPORT_PLUGIN(QGenericEnginePlugin) Q_IMPORT_PLUGIN(QNativeWifiEnginePlugin) Q_IMPORT_PLUGIN(QtQuick2WindowPlugin)
ライブラリヘッダーファイル( %project-name% _global.hを追加する必要があるすべてのこのトラブル
同じディレクトリでMakefile.Releaseファイルを開き、そこから必要な情報を取得します。つまり、プロジェクトに接続する必要があるライブラリのリストです。
LIBS = -lmingw32 -LC:/Qt/5.5.0_Static/lib -lqtmain -LC:/Qt/5.5.0_Static/qml/QtQuick.2 -lqtquick2plugin -LC:/Qt/5.5.0_Static/qml/QtQuick/Window.2 -lwindowplugin -LC:/Qt/5.5.0_Static/plugins/platforms -lqwindows -lwinspool -lshlwapi -lQt5PlatformSupport -lqtfreetype -LC:/Qt/5.5.0_Static/plugins/imageformats -lqdds -lqicns -lqico -lqjp2 -lqmng -lqtga -lqtiff -lqwbmp -lqwebp -LC:/Qt/5.5.0_Static/plugins/qmltooling -lqmldbg_qtquick2 -lQt5Quick -lQt5Gui -lcomdlg32 -loleaut32 -limm32 -lwinmm -lglu32 -lopengl32 -lgdi32 -lqtharfbuzzng -lqmldbg_tcp -lQt5Qml -LC:/Qt/5.5.0_Static/plugins/bearer -lqgenericbearer -lqnativewifibearer -lQt5Network -ldnsapi -lQt5Core -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmpr -lqtpcre
これらはすべて、将来のプロジェクトの.proファイルに追加する必要があります( リストは、バージョンおよびQtのビルド中にオン/オフしたモジュールによって異なる場合があります。したがって、このリストをPCからコピーすることをお勧めします )。 Qt静的アセンブリのヘッダーファイルにパスを追加しても問題ありません。
INCLUDEPATH += C:/Qt/Qt5.5.0_Static/include
プロジェクトにこれらの変更を加えた後、QtQuickの「ミニフレームワーク」を単一のDLLとしてアセンブルできます。 あなたがそれで何をするか、私は知りませんが、誰かがこの情報が役立つことを願っています:)
私のプロジェクト「MyDll」の.proファイル
QT += core widgets qml quick CONFIG += dll TEMPLATE = lib TARGET = mydll DEFINES += MYDLL_LIBRARY SOURCES += mydll.cpp HEADERS += mydll.h \ objectfactory.h INCLUDEPATH += C:/Qt/Qt5.5.0_Static/include LIBS += -lmingw32\ -LC:/Qt/5.5.0_Static/lib -lqtmain\ -LC:/Qt/5.5.0_Static/qml/QtQuick.2 -lqtquick2plugin\ -LC:/Qt/5.5.0_Static/qml/QtQuick/Window.2 -lwindowplugin\ -LC:/Qt/5.5.0_Static/plugins/platforms -lqwindows -lwinspool -lshlwapi -lQt5PlatformSupport -lqtfreetype\ -LC:/Qt/5.5.0_Static/plugins/imageformats -lqdds -lqicns -lqico -lqjp2 -lqmng -lqtga -lqtiff -lqwbmp -lqwebp\ -LC:/Qt/5.5.0_Static/plugins/qmltooling -lqmldbg_qtquick2 -lQt5Quick -lQt5Gui -lcomdlg32 -loleaut32 -limm32 -lwinmm -lglu32 -lopengl32 -lgdi32 -lqtharfbuzzng -lqmldbg_tcp -lQt5Qml\ -LC:/Qt/5.5.0_Static/plugins/bearer -lqgenericbearer -lqnativewifibearer -lQt5Network -ldnsapi -lQt5Core -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmpr -lqtpcre
mydll.h
#ifndef MYDLL_H #define MYDLL_H #include <QtPlugin> Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) Q_IMPORT_PLUGIN(QDDSPlugin) Q_IMPORT_PLUGIN(QICNSPlugin) Q_IMPORT_PLUGIN(QICOPlugin) Q_IMPORT_PLUGIN(QJp2Plugin) Q_IMPORT_PLUGIN(QMngPlugin) Q_IMPORT_PLUGIN(QTgaPlugin) Q_IMPORT_PLUGIN(QTiffPlugin) Q_IMPORT_PLUGIN(QWbmpPlugin) Q_IMPORT_PLUGIN(QWebpPlugin) Q_IMPORT_PLUGIN(QtQuick2Plugin) Q_IMPORT_PLUGIN(QTcpServerConnection) Q_IMPORT_PLUGIN(QGenericEnginePlugin) Q_IMPORT_PLUGIN(QNativeWifiEnginePlugin) Q_IMPORT_PLUGIN(QtQuick2WindowPlugin) #include <QGuiApplication> #include <QQuickView> class MyDll { ... }; #endif