2017-01-21 70 views
0

在我開始之前原諒我,因爲我不是一個C/C++等程序員,僅僅是PHP一個:)但我一直在使用其他一些來自在線開源回購站的項目,比如svn和git 。對於其中一些項目,我需要安裝庫,然後運行「./configure」,「make」,然後「make all」(作爲示例),然後在「構建」虛擬機上執行以獲取二進制文件我需要在我的項目中使用。從源頭上「製造」一些東西是否是獨立的?

的一些項目的最終目標是,然後把這些「編譯」(如果這是正確的說法)的二進制文件,並放置到一個虛擬機,我會再重新分配(按許可證等) 。

我的問題是這樣的:當我在構建機器上構建這些二進制文件時,首先需要構建它們的所有先決條件(「構建必備」和「cmake」和「gcc 「等等) - 一旦二進制文件位於我的構建機器上(例如在/ usr/lib中),它們是自包含的,我只能複製構建創建的那些/ usr/lib二進制文件並將它們放入我將分發的虛擬機上的相同文件夾,沒有構建服務器上安裝了所有構建組件?

有了,我需要建立源的地方所有的依賴關係,是否會終於建成了二進制包含所有這些本身,還是我必須包括他們的分佈式服務器上呢?

會這樣嗎?這個問題有點過於籠統,也許這一切都取決於我正在建設什麼?從最初的發佈

更新一對夫婦的反應

我將分配虛擬機自己,因爲我會在他們建造它們,然後再安裝我的項目之後。因此,我完全瞭解操作系統和環境。我只是不想讓一個已經安裝了,我實際上並不需要,因爲編譯的可執行文件,我會在虛擬機分佈在放置爲例如在/ usr/local/bin目錄,以「膨脹」他們不必要的軟件...

回答

2

這取決於它如何鏈接你的程序庫的依賴。在大多數情況下,默認的是鏈接動態,這意味着你需要分佈可執行沿其DEPS。您可以檢查使用ldd命令運行文件需要哪些庫。

理論上,你可以鏈接所有的東西靜態,這意味着庫代碼將被編譯爲可執行文件。因此,可執行文件實際上是獨立的,但靜態鏈接並不總是可行的。這取決於你正在使用的實際圖書館,並可能需要在建造時使用./configure參數。

最後,還有一些liraries總是動態鏈接,如libc。好的一點是你分發的機器肯定會有這個庫。壞消息是這些庫的版本可能不同,你可能會遇到ABI不匹配的情況。

總之,如果您的項目不是很大,有可能是靜態鏈接的一切,就這樣走了。如果沒有,請閱讀AppImageDocker

0

構建庫和頭文件(二進制分發)的分發是一種可行的方法,應該可行。 (我總是在我的項目中執行此操作。)

所建立的所有庫都不必安裝到/ usr/lib中。爲了保持目標機器清潔,可以將其安裝在其他文件夾中,例如

  • /usr/local/MYLIB/lib/libmylib.so
  • /usr/local/MYLIB/include/mylib.h
  • /usr/local/MYOTHERLIB/lib/libmyotherlib.so
  • /usr/local/MYOTHERLIB/include/libmyotherlib.so

優點:

  1. 安裝方便,易於刪除
  2. 一個子文件夾中的所有文件,沒有文件丟失,與其他庫
  3. 沒有混合

缺點:

  1. 加載程序必須知道額外的搜索路徑
相關問題