2013-07-26 115 views
2

我的C++應用程序依賴於GCC,MongoDB C++驅動程序和Boost。我目前的做法是保持操作系統的一致性。我在Ubuntu 12.04 64位桌面上開發C++,並將其部署到Ubuntu 12.04 64位服務器上。另外,我應該在目標服務器上安裝相同版本的依賴關係。 但是,如果我想在Ubuntu 13.04上開發我的C++應用程序並使用最新的Boost,MongoDB驅動程序和GCC 4.8.1,可以很容易地在Ubuntu 12.04服務器上部署C++應用程序。如何在Linux上部署C++應用程序

  1. 靜態鏈接
  2. 動態鏈接,也部署所有依賴於目標服務器?

哪種方式很簡單?有時,我無法在目標服務器上編譯庫。

+0

你有沒有看過「cmake」來管理依賴和簡單的rpm構建? – kfsone

回答

1

如果依賴關係很小,最簡單的方法就是靜態編譯所有東西。在構建步驟中相當容易,並且不需要任何花哨。但是,隨着更大的圖書館和更大的項目,這可能會變得不方便。

我認爲最好的做法是將依賴關係編譯到共享對象中,然後沿着二進制文件發送它們,並以ld將尋找你的東西的方式執行。我認爲這可以通過例如使用LD_LIBRARY_PATH例如LD_LIBRARY_PATH=/where/did/i/ship/lib:$LD_LIBRARY_PATH my_binary

它可能有點麻煩,因爲你需要設置你的編譯系統來編譯東西作爲共享對象,並妥善包裝一切。

我很確定一些爲linux發佈的預編譯程序以這種方式工作。奇怪的是,我目前找不到任何自定義的預編譯應用程序。

+0

找到,我現在應該從靜態鏈接開始。這很容易,我的應用程序不是很大。 –

0

這取決於您的應用程序。如果您的應用程序僅包含一個特定的二進制文件,則所有C++庫的靜態​​鏈接都是按順序進行的。您可以安全地動態鏈接所有C庫,因爲C ABI不變;這隻會給你帶來版本依賴性。然而,在大多數情況下,主要的SO名稱版本大多是兼容的,並且不同的主要SO名稱的庫可以並行安裝。所以我會依靠軟件包管理器來安裝這些軟件。由於缺乏常見的ABI,C++庫很棘手。即使只是編譯器版本的凹凸可以使他們不兼容*嘆*。

+1

雖然正確的方法是實際製作一個Linux發行版的軟件包。 – 2013-07-26 00:33:09

+0

@ VladLazarenko:那麼在Blender項目中,決定製作一個通用的tarball可分發將比軟件包更好。我必須同意,因爲發行版可以很容易地從中發佈一個包,而使用利基發行版的人也可以使用它。 – datenwolf

+0

沒錯。但想象一下,所有軟件包都具有靜態鏈接的所有依賴關係的世界。那會很糟糕。這兩種方法都有其優點和缺點,如往常一樣:) – 2013-07-26 12:43:00

相關問題