日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

静态库和动态库(转)

發布時間:2023/12/31 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 静态库和动态库(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、靜態庫和動態庫的區別

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

代碼如下:

pr1.c如下:

#include <stdio.h>

void print1(void)

{

??????????????? printf("This is the first lib src!\n");

}

pr2.c如下:

#include<stdio.h>

void print2(void)

{

??????????????? printf("This is the second src lib!\n");

}

main.c如下:

int main(void)

{

??????????????? print1();

??????????????? print2();

??????????????? return 0;

}?

(2)? 編譯pr1.c、pr2.c 文件

gcc -O -c pr1.c pr2.c

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:顯示庫的模塊表清單。一般只顯示模塊名。

ar -rsv libpr.a pr1.o pr2.o

a - pr1.o

a - pr2.o

ar -t libpr.a

pr1.o

pr2.o

(4)? 編譯鏈接選項

-L 及-l 參數放在后面.其中,-L 加載庫文件路徑,-l 指明庫文件名字.

gcc -o main main.c -L./ -lpr???? //生成main

(5)執行目標程序

./main

This is the first lib src!

This is the second src lib!

三、動態庫(隱式調用)

(1)設計庫代碼?

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

gcc -O -fpic -shared -o xxx.so pr1.c

ls -l *.so

-rwxrwxr-x??????? 1 bill????????? bill????????????????? 6592??? 4 月? 15 15:19 xxx.so

(3)動態庫的隱式調用?

main.c代碼如下:

int main()

{

?????? print();

?????? return 0;

}

gcc -o main main.c ./xxx.so

./main

0x97b5d4:2

this is the first lib src!

當動態庫的位置發生改變時,? 程序將無法正常運行;? 而動態庫取代靜態庫的好處之一則是通過更新動態庫而隨時升級庫的內容.

參考鏈接:

http://www.jb51.net/article/37409.htm

總結

以上是生活随笔為你收集整理的静态库和动态库(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。