無root權(quán)限下解決編譯時(shí)的依賴問題

如果你擁有最高權(quán)限蛇受,如果你只管理一臺(tái)服務(wù)器,那么系統(tǒng)自帶的包管理工具就幫你解決了所有問題厕鹃。但是真實(shí)世界沒有那么美好兢仰,所以我花了那么久時(shí)間去學(xué)習(xí)如何從源碼開始編譯一個(gè)軟件。

環(huán)境為CentOS Linux release 7.4.1708 (Core), Linux內(nèi)核version 3.10.0-693.el7.x86_64剂碴, GCC版本為4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)把将,

Linux的編譯體系

無管理員權(quán)限編譯的常規(guī)三部曲是./configure --prefix=$HOME/usr && make && make install,其中最重要的一步就是configure忆矛,它所做的任務(wù)如下

  • 檢查GCC版本以及是否安裝了編譯所需工具
  • 如果需要頭文件察蹲,則默認(rèn)去/usr/include查找
  • 如果涉及到動(dòng)態(tài)編譯庫,則默認(rèn)去/usr/lib/usr/lib64查找. 注:lib的函數(shù)庫僅用于開機(jī)時(shí)用,提供給/bin和/sbin.

那為何需要配置催训?配置主要解決軟件開發(fā)和軟件實(shí)際安裝時(shí)平臺(tái)不同所導(dǎo)致的問題洽议。

首先,一個(gè)C/C++工程不可能只用到標(biāo)準(zhǔn)庫漫拭,很多已有的輪子就不需要重復(fù)制造亚兄。其次,由于很多軟件都重復(fù)用到相同的依賴庫采驻,那么如果把這些依賴庫獨(dú)立成單獨(dú)的模塊审胚,在調(diào)用的時(shí)候加載,也能節(jié)省空間挑宠。早期為了適配多個(gè)平臺(tái)菲盾,開發(fā)人員需要手寫條件語句來檢查環(huán)境依賴,后來GNU專門開發(fā)了Autotools輔助構(gòu)建源碼編譯所需要的關(guān)鍵文件各淀。

Autotools

編譯環(huán)境變量

./configure -h查看幫助文檔的時(shí)候懒鉴,會(huì)提示幾個(gè)和編譯相關(guān)非常重要的環(huán)境變量。

# 編譯器
CC          指定C編譯器(compiler command)路徑
CXX         指定C++編譯器
# 編譯器選項(xiàng)
CFLAGS      用于C編譯器的選項(xiàng)
CXXFLAGS    用于C++編譯器的選項(xiàng)
LDFLAGS     鏈接相關(guān)選項(xiàng),如果你有自定義的函數(shù)庫(lib dir),即可以用 -L<lib dir>指定
# 預(yù)編譯器
CXXCPP      C++ 預(yù)處理器(preprocessor)
CPP         C 預(yù)處理器(preprocessor)
# 預(yù)編譯器選項(xiàng)
CPPFLAGS    C/C++預(yù)處理器選項(xiàng), 如果你自定義的頭文件临谱,可以用-I<include dir>

Makfile規(guī)則中的編譯命令通常遵守如下規(guī)范:

1,首先從源代碼生成目標(biāo)文件( 預(yù)處理,編譯,匯編 )璃俗,"-c"選項(xiàng)表示不執(zhí)行鏈接步驟;

$(CC) $(CPPFLAGS) $(CFLAGS) example.c   -c   -o example.o

2,然后將目標(biāo)文件鏈接為最終的結(jié)果( 鏈接 )悉默,"-o"選項(xiàng)用于指定輸出文件的名字城豁。

$(CC) $(LDFLAGS) example.o   -o example

這些只是約定俗成的慣例,所以有些人會(huì)“隨性而為”抄课,你也拿他沒有辦法唱星。盡管將源代碼編譯為二進(jìn)制文件的四個(gè)步驟由不同的程序(cpp,gcc/g++,as,ld)完成,但是事實(shí)上 cpp, as, ld 都是由 gcc/g++ 進(jìn)行間接調(diào)用的跟磨。換句話說间聊,控制了 gcc/g++ 就等于控制了所有四個(gè)步驟。從 Makefile 規(guī)則中的編譯命令可以看出抵拘,編譯工具的行為全靠 CC/CXX CPPFLAGS CFLAGS/CXXFLAGS LDFLAGS 這幾個(gè)變量在控制哎榴。所以控制這些變量最簡單的做法是首先設(shè)置與這些 Makefile 變量同名的環(huán)境變量并將它們 export 為 環(huán)境變量(全局),然后運(yùn)行 configure 腳本僵蛛,大多數(shù) configure 腳本會(huì)使用這同名的環(huán)境變量代替 Makefile 中的值

  • CC/CXX: 指定C/C++編譯所在路徑尚蝌,即可以選擇不同的版本的編譯器進(jìn)行編譯。
  • CPPFLAGS: 這是用于預(yù)處理階段的選項(xiàng)充尉。用于添加不在標(biāo)準(zhǔn)路徑/usr/include下的頭文件飘言。如CPPFLAGS="-I$HOME/usr/include -I$HOME/usr/include/ncurses"
  • CFLAGS/CXXFLAGS: 指定頭文件(.h文件)的路徑,如:CFLAGS=-I/usr/include -I/path/include喉酌。同樣地热凹,安裝一個(gè)包時(shí)會(huì)在安裝路徑下建立一個(gè)include目錄,當(dāng)安裝過程中出現(xiàn)問題時(shí)泪电,試著把以前安裝的包的include目錄加入到該變量中來般妙。

CPPFLAG和CFLAGS/CXXFLAGS這兩個(gè)變量可以認(rèn)為是等價(jià)關(guān)系,都用在預(yù)處理階段相速,也就是都能用于指定頭文件所在位置碟渺。

  • LDFLAGS:gcc 等編譯器會(huì)用到的一些優(yōu)化參數(shù),也可以在里面指定庫文件的位置突诬。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib苫拍。每安裝一個(gè)包都幾乎一定的會(huì)在安裝目錄里建立一個(gè)lib目錄。如果明明安裝了某個(gè)包旺隙,而安裝另一個(gè)包時(shí)绒极,它愣是說找不到,可以抒那個(gè)包的lib路徑加入的LDFALGS中試一下蔬捷。

有時(shí)候LDFLAGS指定-L雖然能讓鏈接器找到庫進(jìn)行鏈接垄提,但是運(yùn)行時(shí)鏈接器卻找不到這個(gè)庫榔袋,如果要讓軟件運(yùn)行時(shí)庫文件的路徑也得到擴(kuò)展,那么我們需要增加這兩個(gè)庫給"-Wl,R":

LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib

如在執(zhí)行./configure以前設(shè)置環(huán)境變量 export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib"铡俐,注意設(shè)置環(huán)境變量等號(hào)兩邊不可以有空格凰兑,而且要加上引號(hào)(shell的用法)。那么執(zhí)行configure以后审丘,Makefile將會(huì)設(shè)置這個(gè)選項(xiàng)吏够,鏈接時(shí)會(huì)有這個(gè)參數(shù),編譯出來的可執(zhí)行程序的庫文件搜索路徑就得到擴(kuò)展了

除了通過以上幾種環(huán)境變量為編譯器提供頭文件和靜態(tài)和動(dòng)態(tài)庫文件的位置信息外滩报,還有一種變量叫做 PKG_CONFIG_PATH , 它從xx.pc文件獲取讀取相應(yīng)的環(huán)境環(huán)境锅知。

注意:Linux下編譯共享庫時(shí),必須加上-fPIC參數(shù)脓钾,即export CFLAGS=" -fPIC" CXXFLAGS=" -fPIC"否則在鏈接時(shí)會(huì)有錯(cuò)誤提示.這是在編譯zsh時(shí)候發(fā)現(xiàn)明明裝了ncurse卻還是不能用的共享庫的坑喉镰。

fPIC的目的是什么?共享對(duì)象可能會(huì)被不同的進(jìn)程加載到不同的位置上惭笑,如果共享對(duì)象中的指令使用了絕對(duì)地址、外部模塊地址生真,那么在共享對(duì)象被加載時(shí)就必須根據(jù)相關(guān)模塊的加載位置對(duì)這個(gè)地址做調(diào)整沉噩,也就是修改這些地址,讓它在對(duì)應(yīng)進(jìn)程中能正確訪問柱蟀,而被修改到的段就不能實(shí)現(xiàn)多進(jìn)程共享一份物理內(nèi)存川蒙,它們?cè)诿總€(gè)進(jìn)程中都必須有一份物理內(nèi)存的拷貝。fPIC指令就是為了讓使用到同一個(gè)共享對(duì)象的多個(gè)進(jìn)程能盡可能多的共享物理內(nèi)存长已,它背后把那些涉及到絕對(duì)地址畜眨、外部模塊地址訪問的地方都抽離出來,保證代碼段的內(nèi)容可以多進(jìn)程相同术瓮,實(shí)現(xiàn)共享康聂。

動(dòng)態(tài)庫路徑問題: 由前面可以知道許多大型軟件為了減少體積不會(huì)完全編譯所有功能,而是借助于動(dòng)態(tài)連接技術(shù)在運(yùn)行時(shí)加載封裝好的動(dòng)態(tài)連接庫內(nèi)的功能胞四。這就涉及一個(gè)非常重要的問題恬汁,軟件如何知道動(dòng)態(tài)鏈接庫所處的位置。動(dòng)態(tài)庫搜索路徑分兩種情況辜伟,一種是編譯生成可執(zhí)行文件時(shí)氓侧,另外一種是運(yùn)行可執(zhí)行文件時(shí)。

編譯生成可執(zhí)行文件時(shí)导狡,動(dòng)態(tài)庫的搜索路徑順序如下:

  • 首先gcc會(huì)找-L選項(xiàng)约巷;
  • 然后再找gcc的環(huán)境變量LIBRARY_PATH,可以在.profile設(shè)置這個(gè)環(huán)境變量旱捧,并且可以通過選項(xiàng)-v查看gcc最終編譯時(shí)LIBRARY_PATH的值独郎;
  • 再找內(nèi)定目錄: /lib:/usr/lib:/usr/local/lib,這些都是當(dāng)初compile gcc時(shí)寫在程序內(nèi)的。

注意上面索順序是不會(huì)遞歸在目錄下搜索的囚聚。

生成可執(zhí)行文件后靖榕,運(yùn)行文件時(shí),動(dòng)態(tài)庫的搜索路徑順序如下:

  • 首先編譯目標(biāo)代碼時(shí)指定的動(dòng)態(tài)庫搜索路徑顽铸,就是用選項(xiàng) -Wl,rpath 指定程序在運(yùn)行時(shí)動(dòng)態(tài)庫的搜索路徑茁计,比如gcc -Wl,-rpath,include -L. -ldltest hello.c,在執(zhí)行文件時(shí)會(huì)搜索路徑./include谓松;
  • 環(huán)境變量LD_LIBRARY_PATH指定的動(dòng)態(tài)庫搜索路徑星压;
  • 配置文件/etc/ld.so.conf中指定的動(dòng)態(tài)庫搜索路徑,即在配置文件中添加動(dòng)態(tài)庫的絕對(duì)路徑鬼譬,然后運(yùn)行指令ldconfig是配置文件生效娜膘;
  • 默認(rèn)的動(dòng)態(tài)庫搜索路徑/lib:/usr/lib

同樣上面索順序是不會(huì)遞歸在目錄下搜索的优质。通常使用動(dòng)態(tài)庫簡單做法是:把生成的so文件拷貝到/usr/lib中竣贪,這樣不管是生成可以執(zhí)行文件時(shí),還是執(zhí)行程序時(shí)巩螃,都能找到需要的so文件演怎。但是普通用戶沒有/usr/lib的寫入權(quán)限,所有要指定LD_LIBRARY_PATH.ls

參考資料:

GCC安裝(非必要)

首先讓我們利用系統(tǒng)原來老舊的GCC編譯器編譯出最新版本的gcc吧爷耀,畢竟安裝軟件的時(shí)候,GCC的版本一定要過最低要求拍皮。

第一步: 下載gcc源碼

mkdir -p ~/src && cd ~/src
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.gz
tar -zxvf gcc-7.2.0.tar.gz && cd gcc-7.2.0
ls
check

第二步歹叮, 檢查系統(tǒng)是否已經(jīng)具備前置軟件, 主要是GMP,MPFR, MPC铆帽。這些軟件可以到ftp://gcc.gnu.org/pub/gcc/infrastructure/找到咆耿,然后下載后解壓縮,并移動(dòng)到gcc源碼文件夾下锄贼。 可以在配置的時(shí)候用--with-gmp, --with-mpfr --with-mpc指定具體所在路徑票灰。

cd src
# GNU Multiple precision Library
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 \
&& tar -jxvf gmp-6.1.0.tar.bz2 && mv gmp-6.1.0 gcc-7.2.0/gmp
# isl library
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 \
&& tar -jxvf isl-0.18.tar.bz2 && mv isl-0.18 gcc-7.2.0/isl
# MPFR Library
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 \
&& tar -jxvf mpfr-3.1.4.tar.bz2 && mv mpfr-3.1.4 gcc-7.2.0/mpfr
# MPC Library
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz \
&& tar -zxvf mpc-1.0.3.tar.gz && mv mpc-1.0.3 gcc-7.2.0/mpc

不過更加人性化的方法是在GCC源碼根目錄下運(yùn)行./contrib/download_prerequisites,可以自動(dòng)搞定宅荤。

第三步:使用./configure進(jìn)行配置屑迂。官方強(qiáng)烈建議, 配置所在文件夾一定要和源碼所在文件夾區(qū)分開,此外configure還可以配置很多參數(shù)冯键,我的代碼如下:

mkdir build && cd build
../configure\
    --prefix=$HOME/usr \ # 指定安裝路徑
    --disable-multilib \ # 取消32位庫編譯
    --enable-threads=posix \ # 使用POSIX/Unix98作為線程支持庫

基本上這一步不會(huì)出現(xiàn)太多的報(bào)錯(cuò)惹盼,都能夠順利生成Makefile.

第四步: 編譯. 這步有一個(gè)小技巧就是利用多核處理器進(jìn)行加速,例如make -j2 就是雙核惫确。

這一部分很慢很慢手报,因?yàn)槟J(rèn)設(shè)置下是3個(gè)階段的引導(dǎo)(3-stage bootstrap), 以保證能夠編譯出完整的GCC系統(tǒng)并且還不會(huì)出錯(cuò)蚯舱,你可以在配置的時(shí)候用--disable-bootstrap進(jìn)行關(guān)閉。

第五步: 安裝掩蛤。如果你編譯都成功了枉昏,那么安裝也不會(huì)存在問題了, make install.

那么我們編譯的GCC和系統(tǒng)自帶的有什么區(qū)別嗎揍鸟?

# 從頭編譯
$ $HOME/usr/bin/gcc -v
Using built-in specs.
COLLECT_GCC=/home/zgxu/usr/bin/gcc
COLLECT_LTO_WRAPPER=/home/zgxu/usr/libexec/gcc/x86_64-pc-linux-gnu/7.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --prefix=/home/zgxu/usr --disable-multilib --enable-threads=posix
Thread model: posix
gcc version 7.2.0 (GCC)
# 系統(tǒng)自帶
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)

不談安裝路徑和版本兄裂,基本上 差別 就是在配置這一步,而這些參數(shù)就需要仔細(xì)研究了阳藻。

一個(gè) 錯(cuò)誤 : 'Link tests are not allowed after GCC_NO_EXECUTABLES.' 后來發(fā)現(xiàn)是第三步?jīng)]有在獨(dú)立的文件下構(gòu)建Makefile.

參考資料:

CMake: 平臺(tái)無關(guān)的編譯軟件

不同平臺(tái)有著不同的Make工具用于編譯,例如 GNU Make 晰奖,QT 的 qmake ,微軟的 MS nmake腥泥,BSD Make(pmake)匾南,Makepp,等等蛔外。這些 Make 工具遵循著不同的規(guī)范和標(biāo)準(zhǔn)蛆楞,所執(zhí)行的 Makefile 格式也千差萬別。這樣就帶來了一個(gè)嚴(yán)峻的問題:如果軟件想跨平臺(tái)夹厌,必須要保證能夠在不同平臺(tái)編譯臊岸。而如果使用上面的 Make 工具,就得為每一種標(biāo)準(zhǔn)寫一次 Makefile 尊流,這將是一件讓人抓狂的工作。

CMake就是針對(duì)上面問題所設(shè)計(jì)的工具:它首先允許開發(fā)者編寫一種平臺(tái)無關(guān)的 CMakeList.txt 文件來定制整個(gè)編譯流程灯帮,然后再根據(jù)目標(biāo)用戶的平臺(tái)進(jìn)一步生成所需的本地化 Makefile 和工程文件崖技,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。從而做到“Write once, run everywhere”钟哥。顯然迎献,CMake 是一個(gè)比上述幾種 make 更高級(jí)的編譯配置工具。一些使用 CMake 作為項(xiàng)目架構(gòu)系統(tǒng)的知名開源項(xiàng)目有 VTK腻贰、ITK吁恍、KDE、OpenCV播演、OSG 等.

wget https://cmake.org/files/v3.10/cmake-3.10.2.tar.gz
tar xf cmake-3.10.2.tar.gz
cd cmake-3.10.2

參考資料:

幾個(gè)必須要裝的函數(shù)庫

在安裝之前需要先聲明幾個(gè)環(huán)境變量冀瓦,可以直接添加在配置文件中。這都是后面遇到共享庫的問題得到的經(jīng)驗(yàn)教訓(xùn)写烤。

export CFLAGS=" -fPIC"
export CXXFLAGS=" -fPIC"
export CPPFLAGS="-I$HOME/usr/include -I$HOME/usr/include/ncurses -I$HOME/usr/include/X11"
export LDFLAGS="-L$HOME/usr/lib -L$HOME/usr/lib64"
export LD_LIBRARY_PATH=$HOME/usr/lib:$HOME/usr/lib64
export PKG_CONFIG_PATH=$HOME/usr/lib/pkgconfig:$HOME/usr/share/pkgconfig

ncurses提供了一系列的函數(shù)以便使用者調(diào)用它們?nèi)ド苫谖谋镜挠脩艚缑嬉砻觯S多大名鼎鼎的軟件都用到了ncurses,例如vim, screen,tmux,zsh等洲炊。并且samtools如果需要tview可視化BAM文件感局,也需要這個(gè)庫做支持尼啡。

wget ftp://ftp.invisible-island.net/ncurses/ncurses.tar.gz && tar -zxvf ncurses.tar.gz
./configure --enable-shared --prefix=$HOME/usr
make && make install

Libevent是一個(gè)用C語言編寫的、輕量級(jí)的開源高性能事件通知庫, 后續(xù)安裝tmux時(shí)候需要這個(gè)依賴庫询微。

# libevent
cd src
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
tar -zxvf libevent-2.1.8-stable.tar.gz && cd  libevent-2.1.8
./configure prefix=$HOME/usr && make && make install

bzip2, xz, zlib: 文件壓縮相關(guān)函數(shù)庫崖瞭,后續(xù)samtools編譯時(shí)需要。

wget http://www.zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz && cd zlib-1.2.11 && ./configure --prefix=$HOME/usr && make && make install
wget http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
tar -zxvf bzip2-1.0.6.tar.gz && cd bzip2-1.0.6 && ./configure --prefix=$HOME/usr && make && make install
wget https://tukaani.org/xz/xz-5.2.3.tar.gz
tar -zxvf xz-5.2.3.tar.gz && cd xz-5.2.3 && ./configure --prefix=$HOME/usr && make && make install

openssl, libssh2, libcurl: 計(jì)算機(jī)之間文件傳輸訪問相關(guān)庫撑毛。其中OpenSSL是一個(gè)安全套接字層密碼庫书聚,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協(xié)議代态,并提供豐富的應(yīng)用程序供測(cè)試或其它目的使用寺惫。libssh2是一個(gè)C 函數(shù)庫,用來實(shí)現(xiàn)SSH2協(xié)議蹦疑。libcurl主要功能就是用不同的協(xié)議連接和溝通不同的服務(wù)器.

# 安裝有先后
# openssl
wget https://www.openssl.org/source/openssl-1.0.2m.tar.gz
tar -zxvf openssl-1.0.2m.tar.gz && cd openssl-1.0.2m
# 這里非常神奇的居然是config西雀,添加shared生成動(dòng)態(tài)庫
./config prefix=$HOME/usr shared
make && make install
# 卸載使用 make clean
# libssh2
wget https://www.libssh2.org/download/libssh2-1.8.0.tar.gz
tar -zxvf libssh2-1.8.0.tar.gz && cd libssh2-1.8.0
./configure --with-libssl-prefix=$HOME/usr/ssl --prefix=$HOME/usr
# libcurl
wget https://curl.haxx.se/download/curl-7.56.1.tar.gz
tar -zxvf curl-7.56.1.tar.gz && cd curl-7.56.1
./configure --prefix=$HOME/usr --enable-http --enable-ftp --enable-file --enable-proxy --enable-telnet --enable-libcurl-option --enable-ipv6 --with-lib --with-ssl

readline: GNU提供用于這些命令補(bǔ)全、搜索歷史命令歉摧、行編輯快捷鍵等等這些人性化的交互方式的函數(shù)庫艇肴,缺少這個(gè)標(biāo)準(zhǔn)庫,編譯的R就缺少自動(dòng)補(bǔ)全的功能叁温。

wget http://ftp.gnu.org/gnu/readline/readline-7.0.tar.gz
tar -zxvf readline-7.0.tar.gz && cd readline-7.0
./configure --prefix=$HOME/usr && make && make install

PCRE: 提供和Perl5相同語法和語義正則表達(dá)式的函數(shù)庫再悼,后續(xù)安裝R用到剧辐。

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz
tar -zxvf pcre-8.41.tar.gz && cd pcre-8.41
./configure --enable-utf --enable-pcregrep-libz --enable-pcregrep-libbz2 --prefix=$HOME/usr

x11:X11也叫做X Window系統(tǒng)脯宿,X Window系統(tǒng) (X11或X)是一種位圖顯示的視窗系統(tǒng),是在 Unix 和 類Unix 操作系統(tǒng),以及OpenVMS上建立圖形用戶界面的標(biāo)準(zhǔn)工具包和協(xié)議衙傀,并可用于幾乎所有已有的現(xiàn)代操作系統(tǒng)跟束。主要是R編譯的時(shí)候要用莺奸,具體用途有待開發(fā)。

x11安裝比較復(fù)雜冀宴,有很多的依賴庫灭贷,因此需要先安裝xtrans, xextproto, xcb(lib,xcb-proto, libpthread-subs), kbproto,xproto,inputproto。但是編譯很容易略贮,僅提供下載鏈接

https://www.x.org/releases/X11R7.7/src/lib/xtrans-1.2.7.tar.gz
https://www.x.org/releases/X11R7.7/src/proto/xextproto-7.2.1.tar.gz
https://www.x.org/releases/X11R7.7/src/proto/kbproto-1.0.6.tar.gz
https://www.x.org/releases/X11R7.7/src/proto/xproto-7.0.23.tar.gz
https://www.x.org/releases/X11R7.7/src/proto/inputproto-2.2.tar.gz
https://www.x.org/releases/X11R7.7/src/xcb/libpthread-stubs-0.3.tar.gz
https://www.x.org/releases/X11R7.7/src/xcb/xcb-proto-1.7.1.tar.gz
https://www.x.org/releases/X11R7.7/src/xcb/libxcb-1.8.1.tar.gz
https://www.x.org/releases/X11R7.7/src/lib/libSM-1.2.1.tar.gz
https://www.x.org/releases/X11R7.7/src/lib/libICE-1.0.8.tar.gz
https://www.x.org/releases/X11R7.7/src/lib/libXt-1.1.3.tar.gz

相當(dāng)于人工檢查依賴環(huán)境甚疟,僅僅是繁瑣而已,并不困難

# 安裝X11
wget -4 https://www.x.org/releases/X11R7.7/src/lib/libX11-1.5.0.tar.gz
tar -zxvf libX11-1.5.0.tar.gz && cd libX11-1.5.0
./configure --prefix=$HOME/usr && make && make install

編譯案例

安裝zsh

zsh或許可以認(rèn)為是最好的shell逃延,用過zsh的人都不會(huì)想著bash了览妖。不過zsh自定義配置,可供選擇的插件以及主題實(shí)在是太多揽祥,因此一定要搭配oh-my-zsh黄痪。zsh依賴ncurses.

wget -O zsh.tar.gz https://sourceforge.net/projects/zsh/files/latest/download
tar -zxvf zsh.tar.gz && cd zsh
export CPPFLAGS="-I$HOME/usr/include/" LDFLAGS="-L$HOME/usr/lib"
../configure --prefix=$HOME/usr --enable-shared
make && make install

由于沒有root權(quán)限,無法使用chsh盔然,只能通過在~/.bashrc添加exec $HOME/usr/bin/zsh -l保證登陸的時(shí)候自動(dòng)切換成zsh桅打。其次, zsh搭配oh-my-zsh才完整, 只不過這里只能手動(dòng)安裝了是嗜。

# 從github上克隆oh-my-zsh
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
# 用oh-my-zsh的zsh配置文件替代
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zhsrc
# 安裝一些字體, 不然一些主題會(huì)顯示異常
cd src
git clone https://github.com/powerline/fonts.git --depth=1
cd fonts && ./install.sh

重啟一下終端,后面根據(jù)需要調(diào)整配置文件里的參數(shù)挺尾。

編譯tmux

tmux和screen類似鹅搪,也是文本終端神器, 依賴于libevent和ncurses.

export CPPFLAGS="-I$HOME/usr/include -I$HOME/usr/include/ncurses"
export LDFLAGS="-L$HOME/usr/lib -L$HOME/usr/lib64"
mkdir -p src && cd src
git clone https://github.com/tmux/tmux.git
cd tmux
sh autogen.sh
./configure --prefix=$HOME/usr
make && make install

編譯R語言

由于我自己編譯完全版的GCC套餐,很多之前的gfortran不存在的問題也就不存在了(管理員安裝了Java)遭铺。此外丽柿,R還需要gnu readline, pcre > 8.2, x11。當(dāng)然這些函數(shù)包都在之前安裝好了魂挂。

一些依賴庫

# 安裝tidyverse發(fā)現(xiàn)xm12需要libiconv的libiconv.so.2
https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz

正式安裝

wget https://cran.r-project.org/src/base/R-3/R-3.4.2.tar.gz
tar -zxvf R-3.4.2.tar.gz  && cd R-3.4.2/
./configure --prefix=$HOME/R
make && make install
R configure

到此甫题,我可以說Linux平臺(tái)下即便我沒有root權(quán)限,也沒有多少軟件包是我所不能手工編譯涂召。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坠非,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子果正,更是在濱河造成了極大的恐慌炎码,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秋泳,死亡現(xiàn)場離奇詭異潦闲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)迫皱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門歉闰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卓起,你說我怎么就攤上這事新娜。” “怎么了既绩?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長还惠。 經(jīng)常有香客問我饲握,道長,這世上最難降的妖魔是什么蚕键? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任救欧,我火速辦了婚禮,結(jié)果婚禮上锣光,老公的妹妹穿的比我還像新娘笆怠。我一直安慰自己,他們只是感情好誊爹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布蹬刷。 她就那樣靜靜地躺著瓢捉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪办成。 梳的紋絲不亂的頭發(fā)上泡态,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音迂卢,去河邊找鬼某弦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛而克,可吹牛的內(nèi)容都是我干的靶壮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼员萍,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼腾降!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起充活,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蜂莉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后混卵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體映穗,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年幕随,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚁滋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赘淮,死狀恐怖辕录,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梢卸,我是刑警寧澤走诞,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蛤高,受9級(jí)特大地震影響蚣旱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戴陡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一塞绿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恤批,春花似錦异吻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棋返。三九已至,卻和暖如春笋妥,著一層夾襖步出監(jiān)牢的瞬間懊昨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工春宣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酵颁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓月帝,卻偏偏與公主長得像躏惋,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚷辅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容