- C語言鏈接庫的用法簡記 推薦度:
- 相關(guān)推薦
C語言鏈接庫的用法
庫文件簡單了說就是包含了別人(或者自己)已經(jīng)寫好的代碼,可以直接調(diào)用的其內(nèi)部函數(shù)的文件。庫文件又包含動(dòng)態(tài)庫文件和靜態(tài)庫文件。為什么有靜態(tài)庫和動(dòng)態(tài)庫的區(qū)別,我簡單的介紹一下我所理解的什么是靜態(tài)庫,什么又是動(dòng)態(tài)庫。下面是小編為大家?guī)淼腃語言鏈接庫的用法,歡迎閱讀。
0x01 鏈接庫的簡單理解與編譯命令
庫文件簡單了說就是包含了別人(或者自己)已經(jīng)寫好的代碼,可以直接調(diào)用的其內(nèi)部函數(shù)的文件。庫文件又包含動(dòng)態(tài)庫文件和靜態(tài)庫文件。為什么有靜態(tài)庫和動(dòng)態(tài)庫的區(qū)別,我簡單的介紹一下我所理解的什么是靜態(tài)庫,什么又是動(dòng)態(tài)庫。
靜態(tài)庫
Linux系統(tǒng)下后綴名為*.a
Windows系統(tǒng)下后綴名為*.lib
調(diào)用靜態(tài)庫,在編譯器進(jìn)行編譯過程中,在有需要調(diào)用到庫文件內(nèi)部函數(shù)的地方,編譯器會(huì)將靜態(tài)庫里的函數(shù)實(shí)現(xiàn)過程,拷貝到函數(shù)調(diào)用的地方。在編譯好的程序運(yùn)行時(shí),不需要依賴庫文件,可以獨(dú)立運(yùn)行。庫文件對(duì)代碼復(fù)用性很高,容易理解也容易使用,對(duì)提高開發(fā)速率有很大幫助,不需要自己造輪子。
Linux下生成靜態(tài)庫文件命令
$ gcc -c [FileName].c // 生成*.o文件
$ ar -crv [FileName].a [FileName].o // 生成*.a文件
動(dòng)態(tài)庫
Linux系統(tǒng)下文件名格式為lib*.so
Windows系統(tǒng)下后綴名*.dll
上面介紹了靜態(tài)庫在編譯過程中,編譯器會(huì)將函數(shù)實(shí)現(xiàn)拷貝到可執(zhí)行文件中,所以在程序運(yùn)行時(shí)會(huì)占用一定的資源,造成資源浪費(fèi),而且在庫文件的版本更新中,一點(diǎn)微小的改動(dòng),就需要對(duì)整個(gè)程序進(jìn)行重新編譯發(fā)布,在使用者使用過程中,這是得不償失的。而動(dòng)態(tài)庫,則改進(jìn)了靜態(tài)庫的這些缺點(diǎn)。簡單介紹兩個(gè)方面:
1、靜態(tài)庫在編譯過程中不需要將代碼編譯到可執(zhí)行程序中,在程序運(yùn)行時(shí)需要調(diào)用的時(shí)候才加載。解決了在開發(fā)程序中使用靜態(tài)庫版本更新的問題,使用動(dòng)態(tài)庫不需要將自己編寫的程序重新編譯,更新庫和更新程序是獨(dú)立的兩項(xiàng)任務(wù)。
2、可以實(shí)現(xiàn)庫共享,不同程序的相同功能代碼的實(shí)現(xiàn)可以只需要一份庫文件提供調(diào)用,比如jpeg圖像編碼功能,很多程序都需要進(jìn)行圖像處理,簡單的Logo頭像的顯示到復(fù)雜的平面設(shè)計(jì),不同的軟件可能使用的都是同一份庫文件。
雖然動(dòng)態(tài)庫相對(duì)靜態(tài)庫優(yōu)化了很多缺點(diǎn),但并不是說可以完全不需要靜態(tài)庫。在內(nèi)部開發(fā)的時(shí)候,兩個(gè)同事對(duì)同一個(gè)項(xiàng)目的不同子功能進(jìn)行開發(fā),這些功能具有相互聯(lián)系,但是又不希望對(duì)外部人員提供引用,在程序發(fā)布時(shí),打包編譯所有的代碼實(shí)現(xiàn)都編譯到程序中。
Linux下編譯生成動(dòng)態(tài)庫文件
$ gcc -fPIC -c [FileName].c
$ gcc -shared -o lib[FileName].so [FileName].o
也可以一條命令編譯
gcc -fPIC -shared [FileName].c -o lib[Name].so
0x02 庫的編程使用
我主要使用簡單的編程實(shí)例介紹動(dòng)態(tài)庫的使用,靜態(tài)庫的使用方法與之相同。
我所舉的例子中編寫了3份文件
1、libtest.c // 庫函數(shù)實(shí)現(xiàn),最終將此文件編譯成庫文件
2、test.h // 測試頭文件,文件內(nèi)只有一個(gè)結(jié)構(gòu)體變量
3、main.c // 測試代碼主函數(shù)的實(shí)現(xiàn)
ps: test.h頭文件中只提供了一個(gè)結(jié)構(gòu)體,庫文件并不提供新的變量類型引用,新的變量一定需要定義
直接呈上代碼
test.h:
/** test.h **/
#ifndef TEST_H
#define TEST_H
typedef struct {
int a;
char b;
}Test_t;
#endif
libtest.c:
/** libtest.c **/
#include
#include
#include "./test.h"
int fun1(int a)
{
return a*2;
}
Test_t *fun2(Test_t a)
{
a.a++;
a.b = 's';
Test_t *b = malloc(sizeof(Test_t));
*b = a;
return b;
}
很簡單的內(nèi)容,兩個(gè)函數(shù),fun1()和fun2()
先編譯庫文件 libtest.so
$ gcc -fpic -shared libtest.c -o libtest.so
main.c:
/** main.c **/
#include
#include
#include "./test.h"
int main()
{
//struct TEST_T A;
Test_t A;
A.a = 10;
A.b = 'w';
printf("[init] Test.a = %d ", A.a);
printf("[init] Test.b = %c ", A.b);
printf(" ");
printf("[call] fun1() = %d ", fun1(A.a));
printf(" ");
Test_t *B;
B = (Test_t *)fun2(A); // 加強(qiáng)制轉(zhuǎn)換
printf("[call] fun2().a = %d ", B->a);
printf("[call] fun2().b = %c ", B->b);
printf(" ");
free(B);
}
編譯主程序
$ gcc main.c -L./ -ltest -I./ -o main
0x03 測試&結(jié)果
wangsansan@ubuntu$ ./main
[init] Test.a = 10 [init] Test.b = w
[call] fun_test() = 20
[call] fun2_test().a = 11
[call] fun2_test().b = s
wangsansan@ubunut$
【C語言鏈接庫的用法】相關(guān)文章:
C語言鏈接庫的用法簡記07-21
c語言鏈表的用法10-20
c語言strcmp的用法10-26
c語言if語句的用法07-23
assert用法(C語言)05-30
C語言#include用法10-17
C語言#define的用法08-19
C語言assert的用法10-29
C語言指針的用法07-02