簡體   English   中英

如何為Linux的Qt應用程序進行二進制分發

[英]How to make binary distribution of Qt application for Linux

我正在開發跨平台的Qt應用程序。 雖然不是開源的,但它是免費軟件。 因此,我想將其作為編譯二進制文件分發。

在Windows上沒有問題,我將我編譯的exe與MinGW和Qt的DLL打包在一起,一切都很順利。

但是在Linux上存在一個問題,因為用戶可能在他/她的系統中擁有與我的完全不同的共享庫。

Qt部署指南提出了兩種方法:靜態鏈接和使用共享庫。 第一個產生巨大的可執行文件,並且還需要Qt所依賴的許多庫的靜態版本,即我必須從划痕重建所有這些庫。 第二種方法是基於在應用程序啟動之前重新配置動態鏈接器,對我來說似乎有點棘手。

任何人都可以分享他/她在Linux下分發Qt應用程序的經驗嗎? 我應該使用什么方法? 我可能遇到什么問題? 有沒有其他方法來完成這項工作?

共享庫是可行的方法,但您可以避免使用LD_LIBRARY_PATH (它涉及使用啟動程序shell腳本運行應用程序等)使用-rpath編譯器標志構建二進制文件,指向存儲庫的存儲庫。

例如,我將庫存儲在二進制文件旁邊或我二進制文件旁邊名為“mylib”的目錄中。 要在我的QMake文件中使用它,我在.pro文件中添加以下行:

QMAKE_LFLAGS += -Wl,-rpath,\\$\$ORIGIN/lib/:\\$\$ORIGIN/../mylib/

我可以使用我的本地庫來運行我的二進制文件,覆蓋任何系統庫,而不需要啟動器腳本。

您還可以在Linux上分發Qt共享庫。 然后,讓您的軟件加載那些而不是系統默認的軟件。 可以使用LD_LIBRARY_PATH環境變量覆蓋共享庫。 這可能是最簡單的解決方案。 您始終可以在可執行文件的包裝腳本中更改此設置。

或者,只需指定用戶需要在系統上安裝的最低庫版本。

當我們在Linux(或任何使用共享庫的應用程序)上分發Qt應用程序時,我們提供了一個目錄樹,其中包含頂部的實際可執行文件和相關的包裝器腳本,其中包含共享庫的子目錄以及您所需的任何其他必要資源我想鏈接進去。

這樣做的好處是,您可以讓包裝器腳本設置運行應用程序所需的一切,而無需擔心用戶設置環境變量,安裝到特定位置等。如果正確完成,這也允許您不必擔心從哪里調用應用程序,因為它始終可以找到資源。

我們實際上通過將所有可執行文件和共享庫放在平台/體系結構子目錄中來進一步采用這種樹結構,以便包裝器腳本可以確定本地體系結構並為該平台調用適當的可執行文件並設置環境變量以找到適當的共享庫。 我們發現這種設置在分發共享公共文件系統的多個不同Linux版本時特別有用。

說到這一切,我們仍然傾向於在可能的情況下靜態構建,Qt應用程序也不例外。 你絕對可以靜態地用Qt構建,你不應該像krbyrd在他的回復中所說的那樣構建很多額外的依賴。

這不是一個答案(sybreon涵蓋了這一點),但請注意,如果你的二進制文件與Qt靜態鏈接,你不能分發你的二進制文件,除非你已經購買了商業許可證,否則你的整個二進制文件屬於GPL(或者你'違反了Qt的執照。)

如果您有商業許可證,請不要介意。

如果您沒有商業許可證,您有兩種選擇:

  1. 動態鏈接Qt v4.5.0或更新版本(LGPL版本 - 除開源應用程序外,您可能不使用以前的版本),或者

  2. 打開源代碼。

sybreon的答案正是我所做的。 您可以隨時將庫添加到LD_LIBRARY_PATH ,也可以做一些更有趣的事情:

每個目錄設置一個裝運的Qt庫。 編寫一個shell腳本,讓它在可執行文件上運行ldd ,並為'not found'運行grep,對於每個庫,將相應的目錄添加到列表中(讓我們稱之為$ LDD)。 完成所有操作后,運行二進制文件,並將LD_LIBRARY_PATH設置為之前的值加上$ LDD。

最后評論“我將不得不從划痕重建所有這些”。 不,你不必。 如果你有這些庫的開發包,你應該有.a文件,你可以靜態鏈接這些。

在Linux上創建Qt應用程序包的最簡單方法可能是linuxdeployqt 它收集所有必需的文件,並允許您構建在大多數Linux發行版上運行的AppImage

確保在最舊的仍然支持的Ubuntu LTS版本上構建應用程序,以便可以在AppImageHub上列出您的AppImage

您可以查看QtCreator文件夾並將其用作示例。 它在QtCreator / bin中qt.confqtcreator.sh文件。

lib / qtcreator是包含所有所需Qt * .so庫的文件夾。 相對路徑在qtcreator.sh中設置,應該重命名為you-app-name.sh

importpluginsqml都在bin目錄下。 它們的路徑在qt.conf文件中設置。 這是QML應用程序部署所必需的。

本文包含有關該主題的信息。 我會自己嘗試一下: http//labs.trolltech.com/blogs/2009/06/02/deploying-a-browser-on-gnulinux/

簡而言之:

  • 使用-platform linux-lsb-g ++配置Qt
  • 應使用-lsb-use-default-linker進行鏈接
  • 打包所有內容並部署(這里需要一些調整,但我還沒有嘗試過對不起)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM