?? glibc2-howto-5.html
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7"> <TITLE>Glibc 2 HOWTO 中文版: 安裝成主要函式庫(kù)</TITLE> <LINK HREF="Glibc2-HOWTO-6.html" REL=next> <LINK HREF="Glibc2-HOWTO-4.html" REL=previous> <LINK HREF="Glibc2-HOWTO.html#toc5" REL=contents></HEAD><BODY><A HREF="Glibc2-HOWTO-6.html">Next</A><A HREF="Glibc2-HOWTO-4.html">Previous</A><A HREF="Glibc2-HOWTO.html#toc5">Contents</A><HR><H2><A NAME="primary-install"></A> <A NAME="s5">5. 安裝成主要函式庫(kù)</A></H2><P><P>這一節(jié)的內(nèi)容是關(guān)於將 glibc2 安裝成你的主要 C 函式庫(kù)。任何你編譯的新程式都將會(huì)連結(jié)到這一個(gè)函式庫(kù),除非你用了特殊的編譯選項(xiàng)來(lái)連結(jié)到其它的版本。<P>假如你是用 RedHat 或 Debian 并且已下載相關(guān)的 rpm 或 deb 檔,請(qǐng)參閱 RedHat 或 Debian 的安裝說(shuō)明,你可以直接跳過(guò)這一節(jié)。<P><H2><A NAME="compiling"></A> <A NAME="ss5.1">5.1 由原始碼編譯函式庫(kù)</A></H2><P><P>這一節(jié)解釋如何由原始碼編譯 glibc 2 與附加套件。如果你想要改變最佳化與組態(tài)選項(xiàng)或使用額外的套件,那你就必須編譯函式庫(kù)。<P><H3>需求</H3><P><P><UL><LI>約 150 MB 的磁碟空間</LI><LI>GNU make 3.75</LI><LI>gcc >= 2.7.2 (最好是 2.7.2.1)</LI><LI>binutils 2.8.1 (假如是 alpha 你需要 snapshot)</LI><LI>bash 2.0</LI><LI>autoconf 2.12 (假如你更動(dòng)了 configure.in)</LI><LI>texinfo 3.11</LI></UL><P>在一安裝有 64MB 記憶體的 i586@133 機(jī)器上,編譯完整的函式庫(kù)與附加套件大約需要三個(gè)小時(shí)。而在 i686@200 的機(jī)器上則約需要一個(gè)半小時(shí)。<P><H3>解開(kāi)原始碼</H3><P><P>你需要從 archive 中解出原始碼才能編譯它,最好的方式是:<BLOCKQUOTE><CODE><PRE> tar xzf glibc-2.0.6.tar.gz cd glibc-2.0.6 tar xzf ../glibc-linuxthreads-2.0.6.tar.gz tar xzf ../glibc-crypt-2.0.6.tar.gz tar xzf ../glibc-localedata-2.0.6.tar.gz </PRE></CODE></BLOCKQUOTE>這將會(huì)把 linuxthreads、crypt 與 localedata 等目錄放到 glibc-2.0.6 目錄下,如此 configure 才能找到這些附加套件。<P><H3>設(shè)定組態(tài)</H3><P><P>在 <CODE>glibc-2.0.6</CODE> 的目錄底下,建立一個(gè)新的目錄 compile,并且 cd 到 compile 底下,所也的工作都會(huì)在這個(gè)目錄中完成,這會(huì)簡(jiǎn)化後續(xù)的清除工作。(發(fā)展者似乎并未讓 'make clean' 作得很好)<BLOCKQUOTE><CODE><PRE> mkdir compile cd compile </PRE></CODE></BLOCKQUOTE><P>執(zhí)行 <CODE>../configure</CODE>。要使用附加套件你必需用 --enable-add-ons 來(lái)指定,例如 --enable-add-ons=linuxthreads,crypt,localedata。也許你也會(huì)想要指定安裝的目錄,要符合 linux 標(biāo)準(zhǔn)架構(gòu),指定為 --prefix=/usr。(當(dāng)在 linux 系統(tǒng)上 prefix 被設(shè)為 <CODE>/usr</CODE>,configure 知道要調(diào)整其它的路徑,好將 libc.so 以及其它重要的函式庫(kù)放到 <CODE>/lib</CODE>)完整的 configure 命令如下:<BLOCKQUOTE><CODE><PRE> ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr</PRE></CODE></BLOCKQUOTE><P><H3>編譯</H3><P><P>要編譯與驗(yàn)證,執(zhí)行:<BLOCKQUOTE><CODE><PRE> make make check </PRE></CODE></BLOCKQUOTE><P><H2><A NAME="ss5.2">5.2 準(zhǔn)備安裝</A></H2><P> <P>無(wú)論是由原始碼編譯或是預(yù)先編譯好的版本,你現(xiàn)在必需移動(dòng)某些檔案來(lái)迎接新的函式庫(kù)。任何新編譯的程式會(huì)被連結(jié)到 glibc,但是舊有靜態(tài)連結(jié)的程式仍然倚靠著 libc 5,所以你不能只是覆蓋掉舊有的版本。<P><OL><LI>建立一個(gè)新的目錄來(lái)放置舊檔案:<BLOCKQUOTE><CODE><PRE> mkdir -p /usr/i486-linuxlibc5/lib </PRE></CODE></BLOCKQUOTE></LI><LI>舊的標(biāo)頭檔必需從 <CODE>/usr/include</CODE> 移開(kāi):<BLOCKQUOTE><CODE><PRE> mv /usr/include /usr/i486-linuxlibc5/include </PRE></CODE></BLOCKQUOTE></LI><LI>建立一個(gè)新的 include 目錄,并且設(shè)定到其它 include 目錄的連結(jié):<BLOCKQUOTE><CODE><PRE> mkdir /usr/include ln -s /usr/src/linux/include/linux /usr/include/linux ln -s /usr/src/linux/include/asm /usr/include/asm ln -s /usr/X11R6/include/X11 /usr/include/X11 ln -s /usr/lib/g++-include /usr/include/g++ </PRE></CODE></BLOCKQUOTE>這些連結(jié)須要視你的系統(tǒng)而稍作調(diào)整。最少在 Slackware 中,g++ 標(biāo)頭檔案在 <CODE>/usr/local/g++-include</CODE>,而 Debian 卻放在 <CODE>/usr/include/g++</CODE>,并且將 <CODE>/usr/lib/g++-include</CODE> 連結(jié)到 <CODE>/usr/include/g++</CODE>。在後者的情形,你也許會(huì)想要將原始的 g++ include 目錄移回到<CODE>/usr/include</CODE>。</LI><LI>回存所有額外的標(biāo)頭檔與連結(jié)。某些非標(biāo)準(zhǔn)的函式庫(kù)會(huì)將檔案放至 <CODE>/usr/include</CODE>,或是在 <CODE>/usr/include</CODE> 放置一連結(jié)到它們的 include 目錄下。這些檔案與連結(jié)必須回存,如此才可以正確的使用這些額外的函式庫(kù)。</LI><LI>將你的新函式庫(kù)路徑(例如 <CODE>/usr/i486-linuxlibc5/lib</CODE>)加入到 <CODE>/etc/ld.so.conf</CODE> 的<EM>頂端</EM>。你最好要有 ld.so 1.8.8 或是更新的版本,以避免在安裝完 glibc 之後出現(xiàn)一些奇怪的訊息。</LI><LI>搬移或復(fù)制所有的舊函式庫(kù)到新的目錄。<BLOCKQUOTE><CODE><PRE> mv /usr/lib/libbsd.a /usr/i486-linuxlibc5/lib mv /usr/lib/libc.a /usr/i486-linuxlibc5/lib mv /usr/lib/libgmon.a /usr/i486-linuxlibc5/lib mv /usr/lib/libm.a /usr/i486-linuxlibc5/lib mv /usr/lib/libmcheck.a /usr/i486-linuxlibc5/lib mv /usr/lib/libc.so /usr/i486-linuxlibc5/lib mv /usr/lib/libm.so /usr/i486-linuxlibc5/lib cp /lib/libm.so.5.* /usr/i486-linuxlibc5/lib cp /lib/libc.so.5.* /usr/i486-linuxlibc5/lib </PRE></CODE></BLOCKQUOTE>假如你的 <CODE>/usr</CODE> 與 <CODE>/</CODE> 是在不同的 partition 上,那 <CODE>libm.so.5</CODE> 與 <CODE>libc.so.5</CODE> 應(yīng)該用復(fù)制的非搬移,因?yàn)橐恍┯脕?lái)啟動(dòng) linux 的程式會(huì)需要這兩個(gè)函式庫(kù),因此必須要位在 root partition。</LI><LI>將 <CODE>/usr/lib/*.o</CODE> 移到新的目錄下。<BLOCKQUOTE><CODE><PRE> mv /usr/lib/crt1.o /usr/i486-linuxlibc5/lib mv /usr/lib/crti.o /usr/i486-linuxlibc5/lib mv /usr/lib/crtn.o /usr/i486-linuxlibc5/lib mv /usr/lib/gcrt1.o /usr/i486-linuxlibc5/lib </PRE></CODE></BLOCKQUOTE></LI><LI>在你的函式庫(kù)移動(dòng)後,更新 library cache。<BLOCKQUOTE><CODE><PRE> ldconfig -v </PRE></CODE></BLOCKQUOTE></LI></OL><P><H2><A NAME="ss5.3">5.3 由預(yù)先編譯好的套件安裝</A></H2><P><P>如果你是由一已預(yù)先編譯好的 glibc 安裝,你必須:<BLOCKQUOTE><CODE><PRE> cd / gzip -dc glibc-2.0.bin.i386.tar.gz | tar tvvf - gzip -dc glibc-crypt-2.0.bin.i386.tar.gz | tar tvvf - ldconfig -v </PRE></CODE></BLOCKQUOTE>如果你用的是不同的系統(tǒng)架構(gòu)或是版本,請(qǐng)置換適當(dāng)?shù)臋n名。<P><H2><A NAME="ss5.4">5.4 由原始碼安裝</A></H2><P><P>要由原始碼安裝,執(zhí)行:<BLOCKQUOTE><CODE><PRE> make install ldconfig -v </PRE></CODE></BLOCKQUOTE><P><H2><A NAME="ss5.5">5.5 更新 gcc specs</A></H2><P><P>安裝的最後一步(不管你是由預(yù)先編譯好的套件或是由原始碼安裝)是更新 gcc 的 <CODE>spec</CODE> 檔,讓你可以正確的連結(jié)你的程式。要知道 gcc 所用的是那一個(gè) spec 檔,如下輸入:<BLOCKQUOTE><CODE><PRE> % gcc -v reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs gcc version 2.7.2.2 </PRE></CODE></BLOCKQUOTE><P>在這里,系統(tǒng)是 i486-unknown-linux,而版本則是 2.7.2.2。你必須將 <CODE>/usr/lib/gcc-lib/<系統(tǒng)></CODE> 復(fù)制到舊的系統(tǒng)目錄下:<BLOCKQUOTE><CODE><PRE> cd /usr/lib/gcc-lib/ cp -r i486-unknown-linux i486-linuxlibc5 </PRE></CODE></BLOCKQUOTE><P>到原先的目錄與版本目錄下:<BLOCKQUOTE><CODE><PRE> cd /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2 </PRE></CODE></BLOCKQUOTE>并修改在同一目錄下的 <CODE>specs</CODE>。將這檔案中的 <CODE>/lib/ld-linux.so.1</CODE> 改成 <CODE>/lib/ld-linux.so.2</CODE>,并且要將所有的 <CODE>%{...:-lgmon}</CODE> 表示式刪除,因?yàn)?glibc 不使用 gmon 函式庫(kù)來(lái)做 profiling。你可以在 <A HREF="Glibc2-HOWTO-9.html#specs">Specs 檔□例</A> 找到一份 specs 檔的□例。<P><H2><A NAME="ss5.6">5.6 測(cè)試你的安裝</A></H2><P><P>要測(cè)試安裝是否正確,請(qǐng)建立 glibc.c 如下:<BLOCKQUOTE><CODE><PRE> #include <stdio.h> main() { printf("hello world!\n"); } </PRE></CODE></BLOCKQUOTE>并且 compile 這個(gè)程式:<BLOCKQUOTE><CODE><PRE> % gcc glibc.c -o glibc </PRE></CODE></BLOCKQUOTE>使用 ldd 來(lái)查證這個(gè)程式是連結(jié)到 glibc2 而非你的舊 libc:<BLOCKQUOTE><CODE><PRE> % ldd glibc libc.so.6 => /lib/libc.so.6 (0x4000e000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) </PRE></CODE></BLOCKQUOTE>假如這個(gè)程式可以通過(guò) compile,并且在執(zhí)行後產(chǎn)生 "hello world!"的輸出,那麼表示已經(jīng)安裝成功。<P><P><HR><A HREF="Glibc2-HOWTO-6.html">Next</A><A HREF="Glibc2-HOWTO-4.html">Previous</A><A HREF="Glibc2-HOWTO.html#toc5">Contents</A></BODY></HTML>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -