a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

深入探討Linux靜態庫與動態庫的詳解(一看就懂)

2020-01-26 16:07:26
字體:
來源:轉載
供稿:網友
庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。
一、靜態庫和動態庫的區別
1. 靜態函數庫
這類庫的名字一般是libxxx.a;利用靜態函數庫編譯成的文件比較大--空間,因為整個函數庫的所有數據都會被整合進目標代碼中,他的優點就顯而易見了,即編譯后的執行程序不需要外部的函數庫支持,因為所有使用的函數都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函數庫改變了,那么你的程序必須重新編譯。
2. 動態函數庫
這類庫的名字一般是libxxx.so;相對于靜態函數庫,動態函數庫在編譯的時候并沒有被編譯進目標代碼中,你的程序執行到相關函數時才調用該函數庫里的相應函數,因此動態函數庫所產生的可執行文件比較小。由于函數庫沒有被整合進你的程序,而是程序運行時動態的申請并調用--時間,所以程序的運行環境中必須提供相應的庫。動態函數庫的改變并不影響你的程序,所以動態函數庫的升級/更新比較方便。
 
二、靜態庫

(一)簡單介紹
/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc /
  main.c src/* -I./include -L./lib -lmpi -o main
    /opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc 為交叉編譯工具鏈
    /為換行,表示下一行與當行為同一行,‘/'后面不能有空格
    main.c 為主函數
    src/* 為源文件
    -I后面接頭文件
    -L后面接庫文件路徑路徑
    -l后面接庫文件名,全名為libmpi.a
    .a為靜態庫

(二)編寫及使用靜態庫
(1)設計庫源碼 pr1.c、pr2.c 和 main.c
復制代碼 代碼如下:

[bill@billstone make_lib]$ cat pr1.c
#include <stdio.h>
void print1(void)
{
                printf("This is the first lib src!/n");
}
[bill@billstone make_lib]$ cat pr2.c
#include<stdio.h>
void print2(void)
{
                printf("This is the second src lib!/n");
}
[bill@billstone make_lib]$ cat main.c
int main(void)
{
                print1();
                print2();
                return 0;


(2)  編譯pr1.c、pr2.c 文件
復制代碼 代碼如下:

[bill@billstone make_lib]$ gcc -O -c pr1.c pr2.c
[bill@billstone make_lib]$ ls -l pr*.o
-rw-rw-r--        1 bill          bill                    804    4 月  15 11:11 pr1.o
-rw-rw-r--        1 bill          bill                    804    4 月  15 11:11 pr2.o

(3)  鏈接靜態庫
為了在編譯程序中正確找到庫文件,靜態庫必須按照 lib[name].a 的規則命名,如下例中[name]=pr.
ar參數意義:
r:在庫中插入模塊(替換)。當插入的模塊名已經在庫中存在,則替換同名的模塊。
s:寫入一個目標文件索引到庫中,或者更新一個存在的目標文件索引。
v:該選項用來顯示執行操作選項的附加信息。
t:顯示庫的模塊表清單。一般只顯示模塊名。
[bill@billstone make_lib]$ ar -rsv libpr.a pr1.o pr2.o
a - pr1.o
a - pr2.o
[bill@billstone make_lib]$ ar -t libpr.a
pr1.o
pr2.o
(4)  編譯鏈接選項
-L 及-l 參數放在后面.其中,-L 加載庫文件路徑,-l 指明庫文件名字.
[bill@billstone make_lib]$ gcc -o main main.c -L./ -lpr     //生成main
(5)執行目標程序
[bill@billstone make_lib]$ ./main
This is the first lib src!
This is the second src lib!

三、動態庫(隱式調用)
(1)設計庫代碼 
復制代碼 代碼如下:

[bill@billstone make_lib]$ cat pr1.c
#include <stdio.h>
int p = 2;
void print(){
                printf("%p:%d/n", &p, p);
                printf("This is the first dll src!/n");
}

(2)生成動態庫  xxx.so
復制代碼 代碼如下:

[bill@billstone make_lib]$ gcc -O -fpic -shared -o xxx.so pr1.c
[bill@billstone make_lib]$ ls -l *.so
-rwxrwxr-x        1 bill          bill                  6592    4 月  15 15:19 xxx.so

(3)動態庫的隱式調用 
復制代碼 代碼如下:

[bill@billstone make_lib]$ cat main.c
int main()
{
       print();
       return 0;
}
[bill@billstone make_lib]$ gcc -o main main.c ./xxx.so
[bill@billstone make_lib]$ ./main
0x97b5d4:2
this is the first lib src!


當動態庫的位置發生改變時,  程序將無法正常運行;  而動態庫取代靜態庫的好處之一則是通過更新動態庫而隨時升級庫的內容.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 青青草av | 日韩av一区二区三区在线 | 亚洲三级在线看 | 精品久久久久久久久久久久久久 | 人人鲁人人莫一区二区三区 | 欧美日精品 | 亚洲最大av网站 | 国产第99页 | 黄色国产精品 | 91精品一区二区三区久久久久 | 日韩精品亚洲专区在线观看 | 亚洲天堂美女视频 | 黄色av电影在线 | 日韩电影一区二区三区 | 综合一区在线观看 | 伊人久久婷婷 | 性高湖久久久久久久久aaaaa | 国产精品久久 | www.久久久| 国产精品成人在线 | 国产精品久久久久久久久久久新郎 | 亚洲一区中文字幕在线观看 | 国产精品毛片一区二区在线看 | 欧美偷偷操 | 91福利影院在线观看 | 国产综合精品 | 精品日韩av | 欧美成人精品一区二区男人看 | 亚洲成av人片一区二区梦乃 | 男男gay腐片h大尺度 | 性做久久久久久久免费看 | 国产亚洲欧美在线 | 亚洲天堂在线观看视频 | 99热首页 | 久久精品国产欧美 | 亚洲伦理一区 | 国产精品成人3p一区二区三区 | 久久精品视频偷拍 | 亚洲精品免费在线视频 | 国产精品视频一区在线观看 | 亚洲视频一区 |