如果你擁有最高權(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)鍵文件各淀。
編譯環(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
參考資料:
- CFLAGS詳解
- Makefile編譯選項(xiàng)CC與CXX/CPPFLAGS避乏、CFLAGS與CXXFLAGS/LDFLAGS
- 使用gcc時(shí)頭文件路徑和動(dòng)態(tài)鏈接庫路徑
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
第二步歹叮, 檢查系統(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.
參考資料:
- installing GCC: https://gcc.gnu.org/install/
- linux下編譯gcc6.2.0: https://www.cnblogs.com/oloroso/p/5984985.html
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
到此甫题,我可以說Linux平臺(tái)下即便我沒有root權(quán)限,也沒有多少軟件包是我所不能手工編譯涂召。