QtQuickモジュールを使用したDLLライブラリの静的アセンブリ

読者の皆さん、こんにちは。 この記事では、QtQuickモジュールを使用して静的dllライブラリをどのように構築したかについて、できる限り説明しようとします。 すべてのインターネットを探し回ったが、私はまだ私の問題の解決策を見つけることができなかった。



つまり、Qtを* .dllライブラリから切り離すことから始めます。 操作済み: Qt-windows-x86-MinGW-5.5.0-rc、2015.06.17からのスナップショット95 作業環境: Windows 8.1



そのような記事のかなりの数がすでに収集されていることを知っていますが、どうすればよいですか...彼が収集したdllが必要に応じてロードされ始める前に、Qtの異なるバージョンを4回再構築しなければなりませんでした。 このアセンブリでQtWebKitが削除されることをすぐに警告します。 すでに静的なQtビルドをお持ちの場合は、このマニュアルを最も興味深いものに自由に切り替えてください。



それでは始めましょう!

  1. 必要なソフトウェアセットをダウンロードします。



    PythonとRubyはまったく必要ないかもしれませんが、 すべてのマニュアルで、それらは両方とも「必須」と表示されており、サプライズは絶対に必要ありません。インストールします。



  2. 任意のディレクトリにインストール/アンパックします。 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-展開されたソース




  3. qmake構成を編集します。

    • qt-everywhere-opensource-src-5.5.0-rc / qtbase / mkspecs / win32-g ++ / qmake.confファイルを開きます
    • 私たちは線を見つけます

      QMAKE_LFLAGS =
            
            





      それを次のものに置き換えます

       QMAKE_LFLAGS = -static -static-libgcc
            
            



      5.5.0-rcでは70行でした



  4. 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
          
          









  5. 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%のフォルダーに移動し、そこにあるすべてのものを収集します。



  6. コンフィギュレーターを起動します。

     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を削除します」、ありがとうTaraflexToster ;
    • -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コマンドを使用して、 コンフィギュレーターに追加する必要があるパラメーターを見つけてください。




  7. アセンブリを開始します。

     mingw32-make -k
          
          





    psマルチコアプロセッサを使用している場合は、パラメータ-j [ number of cores -1 ] 使用してコレクタに番号を通知する必要があります。 つまり 4コアプロセッサの場合、次のようにビルダーを実行しました。

     mingw32-make -k -j3
          
          





    パラメーター-kの種類は、「何かがうまくいかなかった」場合に停止するようコレクターに指示します。 この不快な状況は私に影響を与えなかったので、私は議論しません。



  8. インストールを開始します。

     mingw32-make install
          
          





    その後、収集したライブラリを含む%QTPREFIX%ディレクトリが必要です。



  9. 静的を構築するためのキットを追加します。

    1. Qt5.5.0-rcとともにインストールされたQtCreatorを実行します
    2. [ ツール ]タブ> [オプション... ] > [ビルドと実行]> [Qtバージョン ]に移動し、 %QTPREFIX% \ 5.5.0 \ binディレクトリから新しいqmakeを追加し、次のように呼び出します: " Qt%{Qt:Version}(%{Qt:バージョン} _Static) 「そして、「 適用 」ボタンをクリックします

      Qtバージョン




    3. キット 」タブに移動して「 追加 」をクリックし、「 Qt5.5.0-Static 」、コンパイラー: MinGW 、プロファイル:「 Qt%{Qt:Version}(%{Qt:Version} _Static)のように呼び出します 。 「 OKボタンをクリックします

      キット
      画像







実際、それがすべてです。 そして今、最後に、 最も興味深い





QtQuickモジュールを使用したDLLライブラリの静的アセンブリ



QtCreator'eで新しいプロジェクトを作成します。





dllライブラリが静的に収集されなかった( より正確には収集されたが、動作しなかった)という事実のすべては、DLL( lib )の構築に使用されたテンプレート( TEMPLATE )にプラグインのリンクが含まれていないことでした。 したがって、それらはすべてヘッダーと.pro-fileに手動で書き込む必要があります

必要なすべてのプラグインのリストを取得するのは簡単でした。



同じディレクトリで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
      
      








All Articles