2009-06-01 79 views
16

我正在開發跨平臺的Qt應用程序。 它是免費的,雖然不是開源的。因此我想將它作爲編譯好的二進制文件分發。如何使Linux的Qt應用程序的二進制分發

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

但是在Linux上有一個問題,因爲用戶可能在他/她的系統中共享庫與我的系統非常不同。

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

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

回答

12

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

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

3

不是答案本身(sybreon覆蓋的是),但請注意,你是允許分發二進制文件,如果它是靜態對Qt的鏈接,除非你已經購買了商業許可,否則你的整個二進制瀑布根據GPL(或者您違反了Qt的許可證)。

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

如果你沒有一個商業執照,你有兩個選擇:

  1. 動態鏈接對Qt的V4.5.0或更高版本(LGPL的版本 - 你可以不使用以前的版本除了開放源應用程序)或

  2. 打開你的源代碼。

4

當我們在Linux上發佈的Qt應用程序(或真正使用共享庫的任何應用程序),我們的船,其包含與包含共享庫的子目錄頂部的實際可執行文件和相關的包裝腳本的目錄樹,您不希望鏈接的任何其他必需資源。

這樣做的好處是您可以讓包裝腳本安裝運行應用程序所需的所有內容,而無需擔心讓用戶設置環境變量,安裝到特定位置等。如果操作正確,這也可以讓您不必擔心從哪裏調用應用程序,因爲它總是可以鰭d資源。

實際上,我們通過將所有可執行文件和共享庫放置在平臺/體系結構子目錄中來進一步實現此樹結構,以便包裝腳本可以確定本地體系結構併爲該平臺調用適當的可執行文件並設置環境變量找到適當的共享庫。我們發現這個設置在分發共享一個通用文件系統的多個不同的linux版本時特別有用。我們仍然傾向於在可能的情況下進行靜態構建,Qt應用程序也不例外。您肯定可以靜態構建Qt,並且您不必在krbyrd響應中指出的情況下構建大量額外的依賴項。

3

sybreon's answer正是我所做的。你可以總是添加你的庫到LD_LIBRARY_PATH或者你可以做一些更花哨的事情:

設置你的發貨Qt庫每個目錄。編寫一個shell腳本,在可執行文件上運行ldd,爲每個這些庫運行grep for'not found',將相應的目錄添加到列表中(我們稱它爲$ LDD)。在全部完成後,運行帶有LD_LIBRARY_PATH的二進制文件,將其設置爲之前的值加上$ LDD。

最後發表評論有關「我將不得不從劃痕重建所有」。不,你不需要。如果你有這些庫的開發包,你應該有.a文件,你可以靜態鏈接這些文件。

15

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

例如,我存儲我的圖書館要麼我旁邊的二進制或在一個名爲「MYLIB」我旁邊的二進制文件目錄。在我QMAKE文件中使用此,我在.pro文件中加入這一行:

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

我可以跟我的本地庫覆蓋任何系統庫運行我的二進制文件,並沒有需要一個啓動程序腳本。

0

你可以看看QtCreator文件夾並以此爲例。它有qt.confqtcreator.sh文件QtCreator/bin

lib/qtcreator是具有所有需要的Qt * .so庫的文件夾。相對路徑在qtcreator中設置。SH,這應該被重新命名爲you-app-name.sh

進口插件QML都在裏面目錄。路徑設置在qt.conf文件中。這是QML應用程序部署所需的。

1

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

確保您在最早的仍支持的Ubuntu LTS發行版上構建應用程序,以便您的AppImage可以在AppImageHub上列出。

相關問題