在遠程登錄的Ubuntu服務器上經過命令行源碼編譯安裝 GNU M四、autoconf、automake 等程序

  因爲實驗須要,最近得到了一個實驗室服務器的帳號,日常主要經過 ssh 進行遠程登錄進行實驗。一方面,遠程登陸的機器只提供終端界面,通常只經過命令行進行任務操做;另外一方面,因爲是多人共享服務器,故而我的帳號並不具有 root 權限,平時在我的主機上肆無忌憚 sudo 進行操做以及大不了重裝的作法顯然不太合適。目前遇到的一個問題就是因爲缺乏 root 權限,沒法直接經過包管理工具進行某些軟件的安裝。這裏主要記錄的是經過源代碼編譯的方式在遠程登錄的主機上安裝所需的如 GNU M四、autoconf、automake 等程序的方法。html

 

0.簡介python

  在我的主機上安裝程序時,用戶可使用 apt install xxx 命令安裝所須要的軟件工具( 須要 root 權限,我的用戶通常用 sudo 指令便可),且包管理工具會自動爲用戶配置好當前待安裝的軟件所須要的依賴軟件,使用起來較爲方便和簡潔。新安裝的可執行文件通常存放在目錄 /usr/bin 中( distribution發佈者提供的軟件 ),而用戶自行下載編譯安裝的軟件通常位於 /usr/local/bin ( 非distribution默認提供者提供的軟件 )目錄下,這些軟件相應的頭文件等數據則存放在 /usr/include 和 /usr/local/include 文件夾下。因爲上述目錄位於每一個用戶的環境變量 PATH 中,故而具有 root 權限的用戶安裝好程序後,其餘用戶也可直接使用這些程序。linux

    sudo apt install package-name    //安裝 package-name 以及其所依賴的相關程序

  但當許多用戶共享同一臺服務器時,此時可能只有系統管理員具有 root 權限,單個用戶沒法直接經過 apt install 命令安裝所需的軟件( 普通用戶不具有 sudo 權限 ),普通用戶新安裝的程序也沒法放置在 /usr/bin 和 /usr/local/bin 目錄下( 普通用戶僅具備對上述目錄的讀和執行權限 ),這樣避免了單個用戶的行爲改變系統的通常環境,但也爲普通用戶的環境配置設置了必定的障礙。這種狀況下,通常須要用戶經過源碼手動編譯程序,並將可執行程序放置在本身的主目錄下,從而配置我的的開發環境。下面以安裝 GNU M4 爲例,記錄經過源代碼編譯的方式在遠程登錄的主機上安裝程序的過程。git

 

1.在對應程序的官網下載源代碼壓縮包ubuntu

  首先在本地下載對應程序的安裝包。以安裝 GNU M4 爲例,可經過瀏覽器搜索 GNU M4 ,找到 GNU M4 官網。瀏覽器

 

  經過其中的下載頁面下載較新版本的 GNU M4 源碼包,也就是 xx.tar.xx 文件。bash

  

  

  注:Linux 終端環境下,也能夠直接經過命令行操做直接進行文件的上傳和下載,Linux 命令 curl 和 wget 支持在終端環境下的文件傳輸功能。服務器

  

2. 將下載的源碼包傳送至服務器端並解壓ssh

  想要在遠程登錄的服務端安裝對應的程序,則首先須要將文件傳輸至遠端服務器文件夾下。用戶可經過 ftp 服務或 scp 指令完成文件壓縮包的傳輸。若遠端服務器的 ftp 服務是開啓的,則用戶可在本地安裝 ftp 客戶端,並鏈接遠端服務器,實現文件的傳輸功能。或者用戶可直接經過 Linux 內置的命令 scp 進行文件的傳輸,關於 scp 命令能夠參考筆者的另外一篇記錄遠程登陸與文件傳輸指令——ssh與scpcurl

    scp ~/Downloads/xxx.tar.xxx  user@1.2.3.4:~    //將本地路徑指定的文件傳輸至位於地址 1.2.3.4 處的 user 用戶的主目錄,執行時會首先要求進行密碼驗證 

  完成文件源碼的傳輸後,經過 ssh 命令遠程登錄服務器帳戶,並經過終端命令行進行文件的解壓操做。

  對於後綴爲 .tar.gz 的文件 :

    tar -xzvf xxx.tar.gz    //解壓文件至當前目錄下,可增長 -C dir 參數指定解壓路徑

  對於後綴爲 .tar.bz2 的文件:

    tar -xjvf xxx.tar.bz2    //解壓文件至當前目錄

 

3. 程序的編譯和安裝

  將上述文件壓縮包解壓縮後,便可進入解壓後的文件目錄進行程序的編譯和安裝。Linux 平臺下程序的安裝包通常會有關於安裝和編譯的說明文件,如 README.md 和 INSTALL 文件等,用戶能夠參考其中的說明進行操做。這裏後續的安裝指令即參考 GNU M4 文件的 INSTALL 文件的說明,其餘的經常使用基礎工具如 autoconf、automake 的安裝與其過程大體相同。後續的用戶目錄均使用 /home/xxx,在實際操做時請替換爲用戶的實際目錄 /home/username。

  首先經過 echo $PATH 命令查看當前用戶的環境變量值,找到可存放我的用戶的可執行文件的目錄。以前介紹中有說明,普通用戶不具有對 /usr/bin 和 /usr/local/bin 的寫入權限,故而通常須要手動安裝的可執行程序放在本身的主目錄下,環境變量 PATH 中記錄的是用戶在執行某個命令時,系統依照其中的記錄搜尋可執行文件的目錄的順序,普通用戶的 PATH 變量的第一個目錄即爲本用戶可用的可執行文件的存放位置。

    echo $PATH    //輸出本用戶環境變量 PATH 的值

  在筆者的環境中,在遠端服務器的 PATH 變量的值如如所示,在安裝程序時能夠將可執行程序放置在上述 /home/xxx/.local/bin 或 /home/xxx/bin 目錄下( 不一樣環境狀況可能不一樣 )。這樣當後續須要經過命令行運行可執行程序或者其餘程序尋找所依賴的可執行程序時便可經過 PATH 變量的記錄尋找到存放在上述目錄中的可執行程序。

  

  在肯定可用的可執行文件的安裝目錄後,可依次執行如下命令完成安裝過程。

  檢查系統環境並進行某些編譯設置:

  ./configure --prefix=/home/xxx/.local    //檢查當前安裝所須要的一些必要環境,並設置安裝目錄爲 prefix 指定的目錄下的 bin 目錄( 可執行程序 )和 include 目錄( 頭文件等 )

       根據 INSTALL 文件的說明,默認安裝時可執行程序會被安裝於 /usr/local/bin 目錄下,對應的頭文件安裝於 /usr/local/include 目錄下,而因爲普通用戶不具有對上述目錄的寫入權限,故而須要指定新的安裝參數,將安裝目錄調整爲用戶的主目錄。這裏 --prefix 參數指定最終的安裝目錄,其參數必須爲絕對路徑。如若指定路徑 --prefix=/home/xxx/,則安裝後的可執行文件位於 /home/xxx/bin 文件夾下,而頭文件位於 /home/xxx/include 文件夾下。

  編譯生成可執行文件:

    make                           //根據 makefile 編譯生成可執行程序

  安裝可執行程序

   make install                   //安裝編譯好的可執行程序

  上述指令完成後,在沒有報錯的狀況下即完成了安裝過程,用戶此時應該能夠在指定的可執行文件目錄中看到對應的可執行文件。在實際安裝某個軟件時,需經過上述步驟,依次按依賴條件安裝某個軟件所須要的基礎工具,最後便可完成對應軟件的安裝過程。

 

4.其餘軟件的安裝

  在安裝好特定軟件所依賴的基礎工具後,則可進行特定軟件的安裝。但此時須要注意,已安裝好的依賴工具的可執行程序和相關文件如頭文件、so庫等均位於以前安裝時經過 --prefix 參數指定的目錄下,在筆者的實踐環境中即 /home/xxx/.local 目錄下的 /bin、/lib和/include 目錄。上述目錄並非編譯器在進行編譯時的默認搜索目錄,故而在後續的安裝過程當中,在 configure 步驟以前須要在配置中首先指定編譯過程當中相關文件如頭文件、so庫文件所存放的非默認路徑,才能順利完成軟件的編譯過程。

  用戶能夠經過 ./configure --help 來查看經過 configure 進行環境配置時能夠指定的參數。

    ./configure --help    //查看進行 configure 時能夠指定的參數

  筆者環境下的部分結果如圖所示,用戶可經過這些環境變量來設置編譯器尋找所需頭文件、so文件的非標準路徑。

   

  設置所需的環境變量,以確保編譯過程可以正確尋找到所需的相關文件。其中,應指定頭文件和 so 文件的存放位置,從而保證編譯過程當中編譯器可以找到所需的文件,同時也須要爲連接器指定 so 文件的位置,以便後續執行指令時須要的 so 文件可以被順利加載進內存中

    export CPPFLAGS='-I/home/xxx/.local/include'                        //設置編譯選項,-I 參數指定編譯過程當中首先在給定目錄中搜索所需的頭文件
    export LDFLAGS='-L/home/xxx/.local/lib -Wl,-rpath=/home/xxx/.local/lib'       //設置連接選項,-L 參數指定連接過程當中首先在給定目錄中搜索須要的so庫文件,-rpath 參數指定一個非默認的運行時庫的搜索路徑

  上述參數設置時,若須要指定多個特定的目錄,則須要經過多個 -I/L 參數進行指定.對於 LDFLAGS ,其中的 -Wl 選項表示後續參數爲連接器 ld 的指定參數,-rpath=dir 指定一個非默認的運行時庫的搜索路徑。更多編譯和連接過程使用的參數可參考筆者的記錄Linux下編輯、編譯、調試命令總結——gcc和gdb描述和網上資料。

  在設置完成後,正常的進行步驟3中所描述的 configure 、make 和 make install 安裝過程便可。

 

5.其餘選擇

  理論上,經過源碼安裝的方式能夠安裝全部開源的應用軟件,可是手動安裝應用的過程須要用戶自行解決安裝包之間的依賴關係,好比筆者在經過源碼編譯 git 的過程當中就須要首先經過源碼安裝 m4 、autoconf、automake、openssl、zlib 以及 curl,這樣才能保證編譯出來的 git 具有大多數的經常使用功能,由於在 configure 過程當中,腳本會檢查當前系統上支持的軟件和庫的可用情況,若某些模塊須要的庫不存在,那麼對應的模塊可能並不會被編譯,最終 git 也就沒法使用這些模塊的功能。筆者以前便因爲編譯出來的 curl 庫不支持 https 協議,使得最終編譯生成的 git 不支持經過 https 指定的網址進行 git clone 操做,從而爲操做帶來必定的麻煩。總的來講,經過源碼編譯軟件的方式可以解決問題,但想對來講比較原始和笨拙,故而用戶也能夠根據本身的狀況選擇一些替代方案。

  用戶也能夠安裝  pip 來進行軟件包的安裝和管理。pip 的官方安裝教程在這裏。用戶可經過本地下載好 get-pip.py 文件後經過 ftp 傳送至遠端服務器,也可直接在服務器端經過 wget 或 curl 命令進行下載。在安裝過程當中,須要指定 --user 命令,設置 pip 安裝在本用戶目錄下。

    python get-pip.py --user                 //進行 pip 的本地安裝

   對於使用服務器環境進行以 Python 爲主的計算和分析任務的狀況,用戶可安裝 Anaconda 來進行相關包的安裝和管理,在不具有 root 權限的條件下進行相關的開發和工做。能夠直接在本地下載 Anaconda 的安裝腳本,並經過 ftp 傳送至遠端服務器,再經過命令行進行安裝過程。Anaconda 官網的安裝教程在這裏。Anaconda 安裝完成後,環境變量 PATH 會增長一項 /Path/to/Anaconda/bin ,該目錄位於系統安裝的 python 目錄以前( /usr/bin ),故然後續使用 python 相關的命令時,運行的都是該目錄下包含的 python 工具,其中包含經常使用的 Python 相關工具包括 python、python3 和 pip 等。

    bash /Path/to/Anaconda3-5.3.0-Linux-x86_64.sh    //在下載好安裝包後,命令行安裝 Anaconda3

  在安裝好上述工具後,便可直接經過上述軟件提供的包管理工具進行軟件的安裝和管理,pip 和 conda 的經常使用命令記錄以下。

  pip 的經常使用命令

    pip install package_name      //安裝 package_name 對應的包
    pip uninstall package_name     //卸載 package_name 對應的包
    pip list                       //顯示全部已安裝的包
    pip show package_name      //顯示某個包的詳細信息

  conda 的經常使用命令

    conda install package_name       //安裝 package_name 對應的包
    conda remove package_name        //卸載 package_name 對應的包
    conda list                         //顯示全部已安裝的包
    conda search name                  //搜索 name 對應的包,name 可爲目標包名的一部分
    conda update package_name        //更新 package_name 對應的包

 

參考資料:

  ask ubuntu - How to add libraries path to the ./configure command?

  Linux c 語言頭文件搜索路徑

  Linux系統的頭文件和庫文件搜索路徑

  一文解決C程序的編譯問題

  初學python者自學anaconda的正確姿式是什麼??問題-猴子的回答( 記錄時爲第一個回答 )

相關文章
相關標籤/搜索