linux編譯安裝軟件會遇到依賴各種庫,離線的情況下處理難度非常棘手,下面這個(gè)方法是比較好的方法總結(jié):
原理:
操作系統(tǒng)鏡像包含了各種各樣的庫文件,也就是我們安裝軟件時(shí)所依賴的,但是我們PC上安裝的linux操作系統(tǒng)只是安裝了默認(rèn)的和我們選擇的軟件所依賴的庫,其他的并沒有安裝。也就是依賴庫雖然不存在于操作系統(tǒng)上,但是大多數(shù)在鏡像中是存在的。
實(shí)例
以下是linux 上編譯安裝軟件的方法,既當(dāng)安裝軟件出現(xiàn)缺少某些庫的時(shí)候,就到操作系統(tǒng)鏡像下的Packages文件找對應(yīng)的庫安裝(網(wǎng)站找的會有各種問題:版本不同,系統(tǒng)不同等)
?
到網(wǎng)站 http://archive.kernel.org/centos-vault/6.5/os/i386/Packages/ 下載gcc-4.4.7-4.el6.i686.rpm
rpm -Uvh gcc-4.4.7-4.el6.i686.rpm
提示安裝失敗,依賴
error: Failed dependencies:
??????? cpp = 4.4.7-4.el6 is needed by gcc-4.4.7-4.el6.i686
在http://archive.kernel.org/centos-vault/6.5/os/i386/Packages/? 目錄下搜索cpp 找到cpp-4.4.7-4.el6.i686.rpm
下載,rpm -Uvh cpp-4.4.7-4.el6.i686.rpm 然后 安裝gcc-4.4.7-4.el6.i686.rpm
遇到這樣的報(bào)錯(cuò):
error: Failed dependencies:
??????? libmpfr.so.1 is needed by cpp-4.4.7-4.el6.i686
因?yàn)閘inux的庫前面會有個(gè)前綴lib,所以去搜索的時(shí)候要去掉lib 直接搜mpfr 就能搜到對應(yīng)的rpm
也有例外的,如
?libppl.so.7 is needed by cloog-ppl-0.15.7-1.2.el6.i686
?libppl_c.so.2 is needed by cloog-ppl-0.15.7-1.2.el6.i686
雖然報(bào)了兩個(gè)依賴,實(shí)際只需下載ppl的包(ppl-0.10.2-11.el6.i686.rpm)即可
注意
該離線方法的要點(diǎn)是,通過命令:
cat /etc/issue 顯示的是發(fā)行版本信息
或
lsb_release -a 顯示的是發(fā)行版本信息
查出linux的發(fā)行版本6.5,然后到http://archive.kernel.org/centos-vault網(wǎng)站,根據(jù)自己的系統(tǒng)選擇目錄,找到/os/i386/Packages/ 下的gcc rpm 下載下來,安裝。 (32位是選擇i386 64選擇目錄x86_64)
?
Redis need tcl 8.5 or newer
hadoop@stormspark:~/workspace/redis2.6.13/src$ make test
You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1
?
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz ?
sudo tar xzvf tcl8.6.1-src.tar.gz? -C /usr/local/ ?
cd? /usr/local/tcl8.6.1/unix/ ?
sudo ./configure ?
sudo make ?
sudo make install
################################
?安裝Redis 2.8.18時(shí)報(bào)錯(cuò):
??? zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
??? zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
??? make[1]: *** [adlist.o] Error 1
??? make[1]: Leaving directory `/data0/src/redis-2.6.2/src'
??? make: *** [all] Error 2
make MALLOC=libc
?
l 2018.05.29?
centos 6系列的Linux發(fā)行版,是非常成功(具足UNIX精神)的發(fā)行版,可能大家都已經(jīng)用得非常習(xí)慣了。
但問題是,其內(nèi)核及附帶的工具軟件,版本卻都非常老了。
centos 7上的軟件版本雖然比較新,但centos 7設(shè)計(jì)風(fēng)格的突變(主要是引入了很不符合UNIX精神的systemd),可能在業(yè)界也引起了不少爭議。
而我們苦逼的開發(fā)者,可能面臨既需要使用高版本的相關(guān)組件,又不想升級到centos 7的困境。
那就升級centos 6上的內(nèi)核與工具吧。
升級內(nèi)核還算好辦,因?yàn)閮?nèi)核對編譯環(huán)境的要求很低。不熟悉內(nèi)核升級的朋友,可以參考如下博文。
但是升級gcc等工具,如果不熟悉情況的話,可能就不順利了。
公司研發(fā)環(huán)境上網(wǎng)的不便,centos 6環(huán)境下各種高版本rpm軟件包的缺失,都會給升級帶來麻煩。
本文提供的離線源碼升級方法,就非常適合解決上述難題。
這里順便說明一下,本文的標(biāo)題雖然帶了離線二字,但并不表示本人沒有通過Linux主機(jī)下載相關(guān)文件。
本文為了操作及行文的方便,可能有多處會用wget去下載相關(guān)軟件包或指示下載行為。
只所以帶離線二字,是因?yàn)楸疚奶峁┑姆椒ǚ浅_m用于離線操作。
最后,由于本文的升級全部是基于源碼編譯安裝,與具體的包管理系統(tǒng)(如rpm、apt等)無關(guān)。
因此,本文的方法應(yīng)該也適用于其他Linux發(fā)行版(如ubuntu等)。
先來看看筆者的Linux主機(jī)升級前的情況:
[root@localhost ~]# cat? /etc/redhat-release
CentOS release 6.5 (Final)
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-431.el6.i686
#1 SMP Fri Nov 22 00:26:36 UTC 2013 i686 i686 i386 GNU/Linux
[root@localhost ~]# gcc? --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
[root@localhost ~]# autoconf --version
autoconf (GNU Autoconf) 2.63
[root@localhost ~]# automake? --version
automake (GNU automake) 1.11.1
?
gnu binutils包含as、ld、objdump等工具。從下面的輸了信息來看,相關(guān)工具的版本號,就是binutils的版本號。
[root@localhost ~]# rpm -qa binutils
binutils-2.20.51.0.2-5.36.el6.i686
[root@localhost ~]# as --version
GNU assembler version 2.20.51.0.2-5.36.el6 20100205
[root@localhost ~]# ld --version
GNU ld version 2.20.51.0.2-5.36.el6 20100205
[root@localhost ~]# objdump -v
GNU objdump version 2.20.51.0.2-5.36.el6 20100205
為什么要升級binutils呢?因?yàn)槲覀兪煜さ木幾g工具gcc自己只能將C代碼編譯為以.s結(jié)尾的文本形式的匯編文件。
而.s到.o的過程,則需要由as來完成。而as屬于gnu binutils軟件包。因此,如果不升級binutils,可能會出現(xiàn)這種情況:
gcc按照新款cpu的特點(diǎn)編譯 C代碼,生成的.s文件中含有較新的指令,例如avx2指令(新款x86系列cpu的加速指令)。
而老版的as程序卻不認(rèn)識此指令,結(jié)果導(dǎo)致編譯失敗。另外,像objdump反匯編二進(jìn)制文件時(shí),也同樣可能出現(xiàn)某些指令不能識別的問題。
好了,下面看看相關(guān)工具的升級過程吧。
先來升級gcc吧。
//創(chuàng)建一個(gè)干凈的目錄,用于下載及升級諸工具
[root@localhost ~]# mkdir? tools_update ?
[root@localhost ~]# cd???? tools_update/ ?
[root@localhost tools_update]# wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.bz2 ?
[root@localhost tools_update]# wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2 ?
[root@localhost tools_update]# wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2 ?
[root@localhost tools_update]# wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz ?
//接下來為gcc的編譯做些準(zhǔn)備。 ?
//注意,我們這里不用自己去編譯上面下載的3個(gè)庫。 ?
//我們參考gcc-4.8.2/contrib/download_prerequisites中的方法, ?
//讓gcc的編譯腳本自動幫我們配置并編譯這3個(gè)庫。 ?
//具體步驟如下:
[root@localhost tools_update]# tar -xjf gcc-4.8.2.tar.bz2? ?
[root@localhost tools_update]# cd gcc-4.8.2 ?
[root@localhost gcc-4.8.2]# tar? -xjf? ../mpfr-2.4.2.tar.bz2 ?
[root@localhost gcc-4.8.2]# ln?? -sf mpfr-2.4.2 mpfr ?
[root@localhost gcc-4.8.2]# tar? -xjf ../gmp-4.3.2.tar.bz2 ?
[root@localhost gcc-4.8.2]# ln?? -sf gmp-4.3.2 gmp ?
[root@localhost gcc-4.8.2]# tar? -xzf ../mpc-1.0.3.tar.gz ?
[root@localhost gcc-4.8.2]# ln?? -sf mpc-1.0.3 mpc ?
?
//好了,現(xiàn)在開始配置gcc了。注意,配置命令中的--prefix=/usr的設(shè)置很重要。 ?
//因?yàn)檫@樣設(shè)置,在后面make install時(shí)可以直接覆蓋老的gcc,安裝后就不用再額外設(shè)置其他東西了。
//我們后面其他工具的編譯安裝,也都采用此設(shè)置。這樣最簡單。
[root@localhost gcc-4.8.2]# ./configure? --prefix=/usr? --enable-languages=c,c++ --enable--long-long --enable-threads=posix --disable-checking --disable-multilib
//下面開始編譯gcc了。注意,這個(gè)編譯過程超級漫長。
[root@localhost gcc-4.8.2]# make ?
[root@localhost gcc-4.8.2]# make install ?
//好了,看看升級結(jié)果吧^_^ ?
[root@localhost gcc-4.8.2]# gcc --version ?
gcc (GCC) 4.8.2
?
//然后升級binutils,畢竟這和基礎(chǔ)的構(gòu)建功能是強(qiáng)相關(guān)的。
[root@localhost tools_update]# wget http://ftp.gnu.org/gnu/binutils/binutils-2.25.1.tar.bz2 ?
[root@localhost tools_update]# tar -xjf binutils-2.25.1.tar.bz2? ?
[root@localhost tools_update]# cd binutils-2.25.1 ?
[root@localhost binutils-2.25.1]# ./configure? --prefix=/usr ?
[root@localhost binutils-2.25.1]# make ?
[root@localhost binutils-2.25.1]# make install ?
//好了,看看結(jié)果吧^_^
[root@localhost binutils-2.25.1]# as --version ?
GNU assembler (GNU Binutils) 2.25.1 ?
[root@localhost binutils-2.25.1]# objdump -v ?
GNU objdump (GNU Binutils) 2.25.1 ?
[root@localhost binutils-2.25.1]# ld -v ?
GNU ld (GNU Binutils) 2.25.1 ?
?
//接下來升級其他工具。注意,請保持順序與本文一致。否則可能會失敗。
[root@localhost automake-1.14.1]# wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.xz ?
[root@localhost tools_update]# tar -xJf autoconf-2.68.tar.xz? ?
[root@localhost tools_update]# cd autoconf-2.68 ?
[root@localhost autoconf-2.68]# ./configure --prefix=/usr ?
[root@localhost autoconf-2.68]# make ?
[root@localhost autoconf-2.68]# make install ?
?
[root@localhost tools_update]# wget http://ftp.gnu.org/gnu/automake/automake-1.14.1.tar.xz ?
[root@localhost tools_update]# tar -xJf automake-1.14.1.tar.xz? ?
[root@localhost tools_update]# cd automake-1.14.1 ?
[root@localhost automake-1.14.1]# ./configure --prefix=/usr ?
[root@localhost automake-1.14.1]# make ?
[root@localhost automake-1.14.1]# make install ?
//好了,看看結(jié)果吧^_^
[root@localhost automake-1.14.1]# autoconf? --version ?
autoconf (GNU Autoconf) 2.68 ?
[root@localhost automake-1.14.1]# automake --version ?
automake (GNU automake) 1.14.1 ?
?
?
不過有時(shí)候,版本高了,也會帶來額外的麻煩。
像binutils,從2.22版本開始,在鏈接生成可執(zhí)行程序時(shí),不會自動的隱式鏈接所需的庫,而是需要明確的指定鏈接什么庫。
結(jié)果這導(dǎo)致編譯內(nèi)核時(shí),執(zhí)行make menuconfig失敗。
不過,解決辦法是有的。
按照上文介紹的方法,編譯安裝一個(gè)2.21版的binutils即可。
以后想切到哪個(gè)版本了,直接進(jìn)入源碼目錄執(zhí)行一下make install即可。
---------------------
作者:孫明保
版權(quán)聲明:本文為原創(chuàng)文章,轉(zhuǎn)載請附上鏈接!
本文摘自 :https://blog.51cto.com/l