QT--以共享的方式發布應用,QT依賴庫


Building Qt as a Shared Library

  因為:QT基本上都是采用動態編譯的(被安裝的OS中的),(如安裝包往往都是默認動態編譯處理好的動態庫),所以我們采用動態連接的方式進行發布應用。

  如果采用靜態的方式發布,則需要重新通過對QT的源碼進行“靜態編譯”后形成lib,或者obj的形式。然后安裝在開發的系統中。

《1》采用QTCreater繼承開發環境編譯,以及發布處理。

  總體來說非常方便,

  (1)選擇器以Debug或者Release形式構建

  (2)先編譯通過,完成bug修復

  (3)然后構建成功,發布響應的版本

  注意:根據缺少的dll,與exe一同打包處理,其次,需要根據QT安裝目錄中的plugins插件,添加響應的插件。

  說明:

  QT應用總的各種資源,圖片等,都已經被編譯僅exe可執行文件中。所以不需要對此類文件打包處理。

 

《2》采用命令行的形式發布

(1)進入當前目錄位置,執行以下命令,

  qmake -config release

  nmake

  

發布應用:把要部署的應用環境中:

  (1)與QT相關的DLL(項目總用到的)

  (2)系統OS平台相關的插件,如Qwindows.dll

  (3)QTPulgins部分的,QT需要尋找借助這些文件,處理。

1.  ICU DLLs :QT需要使用ICU庫來進行UNICODE編碼支持,要與版本保持一致。

2. 如果使用了QtWebEngine, 需要 <Qt install path>/bin/QtWebEngineProcess.exe放在應用相同的位置。 If you chose to deploy the binary to a different path, set the QTWEBENGINEPROCESS_PATH environment variable to the binary's absolute path (including its file name).因為QT在開發WebKit應用時,需要通過在安裝的時候,通過此環境變量直接執行:此插件 QtWebEngineProcess.exe,這樣可以更有效率,體驗更好。

3. 如果支持HTML5視頻, 需要 ffmpegsumo.dll (WebM codec plugin網絡視頻編解碼插件) 放在exe應用當先目錄的子目錄qtwebengine文件夾下面,或者 or under the path that the PluginsPath variable was set to in <Qt install path>/<Qt version>/msvc2013/qt.conf.qt.conf是Qt庫的配置文件,其中應該有變量:PluginsPath配置。

4. 如果項目應用需要依賴“當前編譯器”中的執行庫,則同樣這些庫需要隨應用一同發布。包括直接依賴的庫,以及“間接插件”間接依賴的庫。

可以采用depends tool工具查看Qt依賴的庫有哪些。

  把執行文件exe以及所有依賴的dll共同放置在一起。確保部署環境沒有QT安裝的文件,以及QT的環境變量沒有QT。如果應用可以正常運行,則至此應該可以部署成功。但是,如果QT的項目中需要依賴的QT插件,則如果沒有插件依賴的DLL,則相應的功能不能正常使用。

QtWebEngine引擎支持依賴的“文件”:

QT庫中的qt.conf配置文件

QT提供的依賴查詢工具 Dependency Walker Tool (QT提供) 

  (1)查看應用XXXX.exe依賴的數據包,如下圖。

  

  (2)查詢項目中qT采用的插件所依賴的dll

  Qt 插件的處理方式與正常的DLL不同,不能簡單的把插件plugs dll拷貝到與exe相同的位置。QT中插件的應用會尋找exe當前目錄的目錄“plugins”,在這個子目錄中尋找相應的插件文件庫等

  所以,如果確保我們的exe應用完全正常運行,需要在當前exe目錄下新建子目錄“plugins”,然后把插件的dll拷貝進去。

  整個exe當前的文件應該如下形式:

  

插件問題的說明:

(1) the Qt Platform Abstraction (QPA) layer,QT5中的QT抽象平台層,QTGUI應用需要在特定的子目錄下默認platform,下面配置   qwindows.dll.
(2)QT可能需要多種插件支持:打印插件, JPEG圖像格式插件, SQL驅動插件愛你等。一定要把響應的插件與應用一同發布。這些插件往往也需要配置特定的目錄中。 printsupport, imageformats or sqldrivers

  如果需要采用WEbKit開發網頁視圖,則需要包含l text codec plugins來支持網頁的多種編碼 的解析。

  這些插件都是通過“硬編碼”(默認)進了QTCore庫中。默認,QT安裝目錄下的“plugin”目錄是其搜索目錄。這樣的弊端,要求目的部署環境PC需要和QT安裝的目錄一樣,這樣才能找到使用的插件文件。通過以下方式來做應用開發的插件問題支持:

  • Using qt.conf. This approach is the recommended if you have executables in different places sharing the same plugins.
  • Using QApplication::addLibraryPath() or QApplication::setLibraryPaths(). This approach is recommended if you only have one executable that will use the plugin.
  • Using a third party installation utility to change the hard-coded paths in the QtCore library.
    •   

   using QApplication::addLibraryPath ,則 qApp->libraryPaths().返回相同的順序the same order as the QStringList  先添加的會被QT首先尋找。如果使用qApp->setLibraryPaths(),則這樣可以決定被尋找的順序。

  

 這些插件都可以直接在QT安裝目錄下的插件文件目錄中拷貝:

  

  如果還需要執行編譯器特定動態庫(依賴於響應的開發VS版本):

  

  如果項目中需要ICU支持,則需要包含特定的如下庫

  

  如果需要ANGLE支持,則需要包含如下庫

  

 

  綜上:

    按照上述的順序,將項目應用exe,以及所有相關的文件以響應的配置目錄方式處理。則可以確保你的應用在(1)沒有QT庫,(2)沒有編譯器安裝 的部署環境下運行正常運行!!!

 

其他說明:

 (1)對於插件需要特殊的子目錄配置,則可以替代的方案;
  在可以在項目應用的main函數中,便捷的通過以下方式,在QApplication對象創建之前,把響應的目錄添加進QT的應用中,這樣當QT項目中在執行尋找插件時:首先在應用中的路勁尋找,然后在特定的插件默認位置尋找。 using QApplication::addLibraryPath() or QApplication::setLibraryPaths().

  qApp->addLibraryPath("C:\some\other\path");

  通過這種方式,所有任意位置的插件都可以被包含。在最終部署時也可以將插件dll與其他一般dll放置在一起,方便管理配置。

 

《3》當QT項目采用VS2010等IDE開發部署情況

  需要做的額外操作:

 

(1)如果VisualC++庫需要准備的配置編譯器版本以及相關的C運行時庫版本,這樣可以避免因為C運行時庫不同而報的異常。

 

  參考http://www.cnblogs.com/icmzn/p/5935361.html

 

end;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM