2017-05-09 72 views
0

我在努力部署我的Qt/C++應用程序,可能是因爲我還沒有找到關於此在線的好介紹。簡而言之,我的問題是如何在發貨給用戶之前設置一個安裝框架,該框架只需要最少或最好不編譯。分佈式Qt/C++應用程序跨平臺

我想將GUI部署到不同平臺上的用戶,他們可能有或沒有管理員權限。我發現不同的選擇:

  • 靜態編譯Qt - >靜態編譯可執行文件 - >分發可執行文件。有了這個設置,我遇到了Windows安全警告,它需要管理員權限(我還沒有在Linux/macOS上嘗試過)。坦率地說,這種方法看起來不是最優的,因爲我的編譯器不知道如何爲我的用戶優化編譯。

  • 創建安裝程序。但是我開始感到困惑......我是否需要提供一個靜態編譯的GUI可執行文件,或者只是安裝程序,或者兩者都不是?或者,我是否可以通過使用Qt的內置編譯器/庫的安裝程序來避免在我的方面進行預編譯?

+0

您是否閱讀過文檔http://doc.qt.io/qt-5/deployment.html? – sithereal

回答

1

在此設置下我曾經遇到過一個Windows安全警告

您沒有簽署二進制文件。這個問題與Qt無關。即使分發一個簡單的「Hello World」,你也會面對它。

確保您簽署以下的所有

  1. 的可執行文件。

  2. 您重新分配和未簽名的所有DLL(驗證每個DLL)。

  3. 安裝程序。

我的編譯器有沒有關於如何優化編譯我的用戶的主意。

由於C++沒有使用即時編譯,所以這種說法是不言而喻的。當你動態地鏈接你的編譯器時,如果你暗示你需要特定於CPU的變體代碼,也將「不知道」如何編譯「最適合你的用戶」。這必須通過多個可執行文件解決,每個可執行文件都針對特定的CPU進行編譯,並在安裝時進行選擇。不過,我不認爲你的意思。但是,我不知道你的意思是「爲我的用戶進行最佳編譯」。

我是否需要提供我的GUI

的靜態編譯可執行程序,它是給你的。如果您沒有提供靜態編譯的可執行文件,則需要提供所有的依賴項:編譯器的C++運行時,以及Qt所需的所有庫和插件。

在Windows,Linux和OS X上生成靜態鏈接可執行文件的過程是相同的。你從一個靜態配置的Qt副本開始(configure -static -static-runtime),然後構建它,然後用它來構建你的應用程序。最終產品將與C++運行時和Qt庫靜態鏈接。

我需要提供的靜態編譯可執行[...]安裝

只有當你使用的是C++編譯器自己編譯安裝程序。大多數安裝程序生成程序包負責創建沒有附加依賴項的安裝程序,即可以在裸露的Windows系統上運行它。

我能避免在我的身邊,預編譯一起由

Qt提供了再利用無預建的安裝使用安裝程序從Qt的

您可以使用例如NSIS部署編譯器運行時,Qt庫和插件,以及您的應用程序和它需要的任何數據文件。

或者您可以靜態編譯您的應用程序,使其沒有依賴關係,並且是一個.exe文件,並將其作爲便攜式應用程序使用。它也可以自行安裝,即可以將安裝程序捆綁在應用程序中,啓動時應用程序可以檢測它是否已安裝,如果沒有安裝,它會以管理模式重新啓動並執行安裝。

+0

謝謝,這進一步澄清了一切。特別是簽署代碼是我忽略了一些東西。我想我可以很容易地分發靜態編譯的EXE。在Windows上,我已經知道了這一點,但是由於我不是Windows專家,因此獲得靜態編譯的Qt版本花了相當多的時間。我希望在Linux/macOS上這會更快,因爲我更瞭解我在做什麼。 –

1

很明顯,您需要在您想要分發到的每個平臺上構建您的應用程序。最簡單的方法是將所有QT庫動態鏈接到您的應用程序。之後,你需要做的就是提供你的應用程序(如在Windows上的exe文件,或在Linux等可執行文件)和你使用的QT庫(Windows上的DLL,SO文件,我認爲在Linux等)

例如(在Windows上),如果你的應用程序被稱爲MyApp的,並使用QTGui,QTWidgets和QTNetwork,那麼你有下列文件分發:

  • MyApp.exe的
  • QTCore.dll和其他一些需要的DLL稱爲ICU * .dll的東西,不記得)
  • QTGui.dll
  • QTWi dgets.dll
  • QTNetwork.dll

,你可以壓縮它們都在一個ZIP,

編輯後幾點注意事項在評論跟進創建一個安裝等。

標準庫(您稱爲默認庫,它有vector類)是c/C++運行時(在Windows上)或安裝在Linux系統等上的一部分,所以不需要擔心。我不能說所有的編譯器,但對於一些你可以指定一個標誌/參數來靜態鏈接這個運行時(很少有需要這樣做)。

在windows上有一個名爲dependency walker的工具,它提供了應用程序運行所需的所有DLL的列表。在Linux系統上,我不知道,從來沒有真正需要過。但對於自己的應用程序,你知道哪些庫需要,因爲你寫的吧:)

+0

謝謝,我想這個澄清了很多。一些後續問題......系統的/編譯器的so/dylib/dll,我需要擔心這些嗎?我想默認庫(例如'vector')是在可執行文件中編譯的?最後,有沒有辦法自動剖析我需要的共享庫? –

+0

'系統的/編譯器的so/dylib/dll,我是否需要擔心這些?'這個我沒有得到,剩下的我加入了答案。 – cantSleepNow