我是這樣學習Linux下C語言編程的-完全認識GNU C 語言庫glibc

我是這樣學習Linux下C語言編程的-完全認識GNU C 語言庫glibc

1、C語言庫是用來幹什麼的?
編程人員所提到的庫,其英文是library,到底是什麼呢?簡單說就是一些通用的程序代碼被生成文件存儲起來了,以後任何人寫程序時如果需要用到這些通用代碼只需要調用庫函數接口就可以了。比如我們C程序裏通常用的printf函數,就是用來將程序裏的信息輸出到屏幕上的。如果要求每個寫程序的人都自己來寫個函數去調用內核接口實現屏幕輸出,那將是極大的浪費,所以前人已經寫好這個函數相關的庫了,在我們Linux系統中,這個庫是GNU C語言庫glibc,就是這個文件/usr/lib/libc.so。當然,如果要使用一個庫文件,首先得有個頭文件來定義庫文件裏的每個函數,比如/usr/include/stdio.h,我們寫程序時,只需要#include 就可以用printf來向屏幕輸出信息了。
後面我們講到如何自己生成庫文件時,大家一定會相當明白,現在先知道庫的基礎知識吧。
2、如何獲得庫和手冊
首先,搜索到庫文件,在Ubuntu和Debian系列的Linux系統中,我用這個命令就可以:

apt-cache search GNU c library
此命令輸出部分如下:

glibc-doc-reference - GNU C Library: Documentation
libc6 - GNU C Library: Shared libraries
libc6-amd64 - GNU C Library: 64bit Shared libraries for AMD64
libc6-dbg - GNU C Library: Libraries with debugging symbols
libc6-dev - GNU C Library: Development Libraries and Header Files
libc6-dev-amd64 - GNU C Library: 64bit Development Libraries for AMD64
libc6-i686 - GNU C Library: Shared libraries [i686 optimized]
libc6-pic - GNU C Library: PIC archive library
libc6-prof - GNU C Library: Profiling Libraries
libc6-xen - GNU C Library: Shared libraries [Xen version]
或者你可以搜索libc或glibc
因爲我們要編程序,即進行開發,所以我們得安裝libc6-dev這個軟件包。
用這個命令查看一下這個軟件包的具體信息:

apt-cache show libc6-dev
此命令輸出的部分如下:

Description: GNU C Library: Development Libraries and Header Files
Contains the symlinks, headers, and object files needed to compile
and link programs which use the standard C library.
然後就可以運行命令安裝此軟件包:

apt-get install libc6-dev
安裝完成後可以查看一下這個軟件包提供了一些什麼,用下面這個命令:

dpkg -L libc6-dev

此命令輸出如下,即安裝此軟件包後,系統中多瞭如下這些文件:

由於這裏只允許上傳圖片和音樂文件,所以用另一個頁面來存儲這些文本信息了
dpkg -L libc6-dev命令的所有輸出內容在這裏
顯然,在/usr/bin目錄下的是一些工具命令,用來輔助我們編程或調試程序的。/usr/lib目錄下是一些庫文件,我們編寫程序時直接調用這些庫文件提供的函數就可以完成很多工作了。在/usr/include目錄下的就是頭文件,在編程序時要include進來纔可以用庫提供的函數。而在/usr/share/man目錄下的是在線手冊,比如上面有個文件是/usr/share/man/man1/gencat.1.gz,那麼我們可以通過man gencat查看到關於gencat相關的手冊。而在/usr/share/doc/目錄下的就是這個軟件所帶的相關文檔,建議在使用軟件包之前看一下這裏面的一些文檔,相當於是我們的自學教材的。當然,只安裝libc6-dev這一個軟件包可能沒有什麼詳細的資料給你,如果把下面這幾個軟件包也安裝上可能資料就相當全了。

glibc-doc-reference - GNU C Library: Documentation
manpages-dev - Manual pages about using GNU/Linux for development
glibc-doc - GNU C Library: Documentation
glibc-doc-reference這是我們的glibc參考手冊,就象世面上可能會看到的某些書<X編程參考>
manpages-dev是man手冊,安裝上這個軟件包之後,你就可以通過man printf直接來看這個函數的用法。
glibc-doc是文檔。
安裝完這幾個軟件後,可以用dpkg -L命令分別查看一下這幾個軟件包所提供的內容。
比如glibc-doc這個軟件包提供的內容如下:
dpkg -L glibc-doc命令的所有輸出內容在這裏
而manpages-dev軟件包提供的文件如下:
dpkg -L manpages-dev命令的所有輸出內容在這裏

3、如何從手冊中自我學習
首先,我相信在glibc-doc軟件包提供的內容裏有這些東西你一定看到了:

/usr/share/doc/glibc-doc/html
/usr/share/doc/glibc-doc/html/libc.html
/usr/share/doc/glibc-doc/html/libc_1.html
/usr/share/doc/glibc-doc/html/libc_2.html
/usr/share/doc/glibc-doc/html/libc_3.html
/usr/share/doc/glibc-doc/html/libc_4.html
/usr/share/doc/glibc-doc/html/libc_5.html
/usr/share/doc/glibc-doc/html/libc_6.html
/usr/share/doc/glibc-doc/html/libc_7.html
/usr/share/doc/glibc-doc/html/libc_8.html
/usr/share/doc/glibc-doc/html/libc_abt.html
/usr/share/doc/glibc-doc/html/libc_ovr.html
/usr/share/doc/glibc-doc/html/libc_toc.html
很顯然,這是html網頁式的libc文檔,趕緊打開一個瀏覽器打開/usr/share/doc/glibc-doc/html/libc_toc.html來看吧,相信把這幾個文檔看完之後你對libc有一些瞭解了。
其次,在glibc-doc和manpages-dev兩個軟件包裏提供了一些/usr/share/man目錄下的文件。這就是man命令可以看到的內容了。
比如:你可能看到了/usr/share/man/man2/chmod.2.gz,說明在man手冊的第2章有個chmod的幫助手冊。輸入下面的命令看看這個chmod如何編程使用吧:
man 2 chmod
通過這個man手冊你就知道如何自己編寫一個程序來調用函數chmod實現修改文件屬性的工作了。
又比如:你可能看到/usr/share/man/man3/abs.3.gz,說明在man手冊的第3章有個abs的幫助手冊可以看。輸入下面的命令你就知道如何在程序裏求一個數的絕對值了:
man 3 abs

相信你把這些軟件包提供的所有內容都掌握的時候已經是相當高手的了。

/************關於本文檔********************************************
*filename: 我是這樣學習Linux下C語言編程的-完全認識GNU C 語言庫glibc
*purpose: 說明怎樣利用glibc開始Linux下C語言編程
*wrote by: zhoulifa([email protected]) 周立發(http://zhoulifa.bokee.com)
Linux愛好者 Linux知識傳播者 SOHO族 開發者 最擅長C語言
*date time:2007-02-05 13:06
*Note: 任何人可以任意複製代碼並運用這些文檔,當然包括你的商業用途
* 但請遵循GPL
*Thanks to:Google
*Hope:希望越來越多的人貢獻自己的力量,爲科學技術發展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*********************************************************************/

4、看到man手冊後如何編程?
可能有人會問了,其實相當簡單,照着man手冊說的寫到程序裏就行了。
比如man 3 abs時看到:

NAME
abs, labs, llabs, imaxabs - compute the absolute value of an integer

SYNOPSIS
#include >stdlib.h<

int abs(int j);
long int labs(long int j);
long long int llabs(long long int j);

#include >inttypes.h<

intmax_t imaxabs(intmax_t j);

DESCRIPTION
The abs() function computes the absolute value of the integer argument j. The labs(), llabs() and imaxabs() functions compute the
absolute value of the argument j of the appropriate integer type for the function.

RETURN VALUE
Returns the absolute value of the integer argument, of the appropriate integer type for the function.
這裏說得很清楚,abs函數就是用來返回數值j的絕對值的。
我們就可以寫這樣一個程序了:

#include >stdlib.h< /* 把上面的複製下來而已 */
#include >stdio.h< /* 因爲我們要向屏幕輸出信息用到printf函數,man 3 printf會知道需要這個頭文件 */
int main(int argc, char ** argv)
{
int x, y;
x = -321;
y = abs(x);
printf("abs(x)=%d/n", y);
return 0;
}
用gcc編譯程序吧:
gcc abs.c
運行程序:
./a.out
此程序將計算出x變量的絕對值輸出到屏幕。

又比如:man 3 sin可能會看到:

NAME
sin, sinf, sinl - sine function

SYNOPSIS
#include >math.h<

double sin(double x);
float sinf(float x);
long double sinl(long double x);

Link with -lm.

DESCRIPTION
The sin() function returns the sine of x, where x is given in radians.

RETURN VALUE
The sin() function returns a value between -1 and 1.
同樣照着做吧:

#include >math.h< /* 把上面的複製下來而已 */
#include >stdio.h< /* 因爲我們要向屏幕輸出信息用到printf函數,man 3 printf會知道需要這個頭文件 */
int main(int argc, char ** argv)
{
double x, y;
x = 60;
y = sin(x);
printf("sin(x)=%.2f/n", y);
return 0;
}
編譯程序用下列命令:
gcc sin.c -lm
注意這裏比上面的編譯命令多了一個-lm,我怎麼知道的?上面man手冊告訴我的:“Link with -lm.”因爲我們用到了數學庫/usr/lib/libm.so,所以要加上-lm來引用這個庫文件。
運行程序吧:
./a.out
此程序將輸出弧度爲60度的正弦值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章