linux 设计与实现 pdf,Linux库的设计与实现.pdf
Linux庫的設計與實現(xiàn)
一、為什么要使用庫文件
我們在實際編程工作中肯定會遇到這種情況:有幾個項目里有一些函數(shù)模塊的
功能相同,
實現(xiàn)代碼也相同,也是我們所說的重復代碼。比如,很多項目里都有一個用戶驗
證的功能。
代碼段如下:
//UserLogin.h 文件,提供函數(shù)聲明
int IsValidUser(char* username, int namelen);
//UserLogin.c 文件,實現(xiàn)對用戶信息的驗證
int IsValidUser(char* username, int namelen)
{
int IsValid = 0;
/*下面是具體的處理代碼,略去*/
return IsValid;
}
如果每個項目都保存著這兩個UserLogin.h 和UserLogin.c 文件,會有以下幾個
弊端:
1、每個項目里都有重復的模塊,造成代碼重復。
2、代碼的重用性不好,一旦IsValidUser 的代碼發(fā)生了變化,為了保持設計的一
致性,
我們還要手工修改其他項目里的UserLogin.c 文件,既費時又費力,還容易出
錯。
庫文件就是對公共代碼的一種組織形式。
為了解決上面兩個弊端,就提出了用庫文件存放公共代碼的解決方案,其要點
就是
把公共的(也就是可以被多次復用的)目標代碼從項目中分離出來,統(tǒng)一存放到
庫文件中,
項目要用到這些代碼的時候,在編譯或者運行的時候從庫文件中取得目標代碼
即可。庫文件
又分兩種:靜態(tài)庫和動態(tài)庫。
二、靜態(tài)庫與動態(tài)庫
如果程序是在編譯時加載庫文件的,就是使用了靜態(tài)庫。
如果是在運行時加載目標代碼,就成為動態(tài)庫。
換句話說,如果是使用靜態(tài)庫,則靜態(tài)庫代碼在編譯時就拷貝到程序的代碼段,
程序的體積會膨脹。如果使用動態(tài)庫,則程序中只保留庫文件的名字和函數(shù)名,
在運行時去查找
庫文件和函數(shù)體,程序的體積基本變化不大。
靜態(tài)庫的原則是“以空間換時間”,增加程序體積,減少運行時間;
動態(tài)庫則是“以時間換空間”,增加了運行時間,但減少了程序本身的體積。
下面我們就以實際例子來看看如何使用這兩種庫.
三、靜態(tài)庫的編寫和使用
1、概述
靜態(tài)庫文件的擴展名一般為.a,其編寫步驟很簡單。
⑴編寫函數(shù)代碼
⑵編譯生成各目標文件
⑶用ar 文件對目標文件歸檔,生成靜態(tài)庫文件。
注意歸檔文件名必須以lib 打頭。
使用要點:
⑴在gcc 的-I 參數(shù)后加上靜態(tài)庫頭文件的路徑。
⑵在gcc 的-L 參數(shù)后加上庫文件所在目錄
⑶在gcc 的-l 參數(shù)后加上庫文件名,但是要去掉lib 和.a 擴展名。
比如庫文件名是libtest.a 那么參數(shù)就是 -l test
2、編寫最簡單的靜態(tài)庫文件
編寫如下兩個文件,注意放在同一目錄中
myalib.h //靜態(tài)庫頭文件
myalib.c //靜態(tài)庫實現(xiàn)文件
//myalib.h 文件的內容
void test();
//myalib.c 文件的內容
#inlcude
void test()
{
printf("test\n");
}
3、制作庫文件
⑴生成目標文件
gcc -c myalib.c
執(zhí)行完后會生成一個myalib.o 文件
⑵用ar 命令歸檔,格式為ar -rc <.o>
再次提醒,歸檔文件名一定要以lib 打頭, .a 結尾。
ar -rc libtest.a myalib.o
執(zhí)行完后會生成一個libtest.a 文件
4、使用庫文件
⑴編寫一個測試程序main.c,內容為
//main.c 測試靜態(tài)庫調用的程序
#include "myalib.h" //要把函數(shù)的頭文件包含進來,否則編譯時會報錯
int main(int argc,char* argv[])
{
test();
return 0;
}
⑵編譯目標文件,注意要把靜態(tài)庫頭文件的路徑加到-I 參數(shù)里面
gcc -I /root/exercise -o main.o -c main.c
現(xiàn)在生成了一個main.o 文件
⑶生成可執(zhí)行文件,注意要把靜態(tài)庫文件的路徑加到-L 參數(shù)里面,
把庫文件名(去掉打頭的lib 和結尾的.a)加到-l 參數(shù)后面。如下面所示
gcc -o main -L/root/exercise main.o -ltest
此時就會
總結
以上是生活随笔為你收集整理的linux 设计与实现 pdf,Linux库的设计与实现.pdf的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: macos访问linux分区,在linu
- 下一篇: linux下生成guid,在Linux下