亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2013年05月27日 11:17:06   作者:  
本篇文章是對Linux靜態(tài)庫與動態(tài)庫進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
庫從本質(zhì)上來說是一種可執(zhí)行代碼的二進(jìn)制格式,可以被載入內(nèi)存中執(zhí)行。庫分靜態(tài)庫和動態(tài)庫兩種。
一、靜態(tài)庫和動態(tài)庫的區(qū)別
1. 靜態(tài)函數(shù)庫
這類庫的名字一般是libxxx.a;利用靜態(tài)函數(shù)庫編譯成的文件比較大--空間,因?yàn)檎麄€(gè)函數(shù)庫的所有數(shù)據(jù)都會被整合進(jìn)目標(biāo)代碼中,他的優(yōu)點(diǎn)就顯而易見了,即編譯后的執(zhí)行程序不需要外部的函數(shù)庫支持,因?yàn)樗惺褂玫暮瘮?shù)都已經(jīng)被編譯進(jìn)去了。當(dāng)然這也會成為他的缺點(diǎn),因?yàn)槿绻o態(tài)函數(shù)庫改變了,那么你的程序必須重新編譯。
2. 動態(tài)函數(shù)庫
這類庫的名字一般是libxxx.so;相對于靜態(tài)函數(shù)庫,動態(tài)函數(shù)庫在編譯的時(shí)候并沒有被編譯進(jìn)目標(biāo)代碼中,你的程序執(zhí)行到相關(guān)函數(shù)時(shí)才調(diào)用該函數(shù)庫里的相應(yīng)函數(shù),因此動態(tài)函數(shù)庫所產(chǎn)生的可執(zhí)行文件比較小。由于函數(shù)庫沒有被整合進(jìn)你的程序,而是程序運(yùn)行時(shí)動態(tài)的申請并調(diào)用--時(shí)間,所以程序的運(yùn)行環(huán)境中必須提供相應(yīng)的庫。動態(tài)函數(shù)庫的改變并不影響你的程序,所以動態(tài)函數(shù)庫的升級/更新比較方便。
 
二、靜態(tài)庫

(一)簡單介紹
/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 為交叉編譯工具鏈
    \為換行,表示下一行與當(dāng)行為同一行,‘\'后面不能有空格
    main.c 為主函數(shù)
    src/* 為源文件
    -I后面接頭文件
    -L后面接庫文件路徑路徑
    -l后面接庫文件名,全名為libmpi.a
    .a為靜態(tài)庫

(二)編寫及使用靜態(tài)庫
(1)設(shè)計(jì)庫源碼 pr1.c、pr2.c 和 main.c
復(fù)制代碼 代碼如下:

[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 文件
復(fù)制代碼 代碼如下:

[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)  鏈接靜態(tài)庫
為了在編譯程序中正確找到庫文件,靜態(tài)庫必須按照 lib[name].a 的規(guī)則命名,如下例中[name]=pr.
ar參數(shù)意義:
r:在庫中插入模塊(替換)。當(dāng)插入的模塊名已經(jīng)在庫中存在,則替換同名的模塊。
s:寫入一個(gè)目標(biāo)文件索引到庫中,或者更新一個(gè)存在的目標(biāo)文件索引。
v:該選項(xiàng)用來顯示執(zhí)行操作選項(xiàng)的附加信息。
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)  編譯鏈接選項(xiàng)
-L 及-l 參數(shù)放在后面.其中,-L 加載庫文件路徑,-l 指明庫文件名字.
[bill@billstone make_lib]$ gcc -o main main.c -L./ -lpr     //生成main
(5)執(zhí)行目標(biāo)程序
[bill@billstone make_lib]$ ./main
This is the first lib src!
This is the second src lib!

三、動態(tài)庫(隱式調(diào)用)
(1)設(shè)計(jì)庫代碼 
復(fù)制代碼 代碼如下:

[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)生成動態(tài)庫  xxx.so
復(fù)制代碼 代碼如下:

[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)動態(tài)庫的隱式調(diào)用 
復(fù)制代碼 代碼如下:

[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!


當(dāng)動態(tài)庫的位置發(fā)生改變時(shí),  程序?qū)o法正常運(yùn)行;  而動態(tài)庫取代靜態(tài)庫的好處之一則是通過更新動態(tài)庫而隨時(shí)升級庫的內(nèi)容.

相關(guān)文章

  • C/C++使用socket實(shí)現(xiàn)判斷ip是否能連通

    C/C++使用socket實(shí)現(xiàn)判斷ip是否能連通

    這篇文章主要為大家詳細(xì)介紹了C/C++如何使用socket實(shí)現(xiàn)判斷ip是否能連通,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-07-07
  • 深入理解C++中的文件操作

    深入理解C++中的文件操作

    這篇文章主要給大家深入的介紹了C++中的文件操作,文件的操作對每個(gè)程序員來說都是很重要的,本文的介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 計(jì)時(shí)器的time_t和clock_t 的兩種實(shí)現(xiàn)方法(推薦)

    計(jì)時(shí)器的time_t和clock_t 的兩種實(shí)現(xiàn)方法(推薦)

    下面小編就為大家?guī)硪黄?jì)時(shí)器的time_t和clock_t 的兩種實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • 詳解C語言中的錯誤報(bào)告errno與其相關(guān)應(yīng)用方法

    詳解C語言中的錯誤報(bào)告errno與其相關(guān)應(yīng)用方法

    這篇文章主要介紹了C語言中的錯誤報(bào)告errno與其相關(guān)應(yīng)用方法,包括errno和strerror以及perror的介紹,需要的朋友可以參考下
    2015-08-08
  • C語言回調(diào)函數(shù)的簡單運(yùn)用

    C語言回調(diào)函數(shù)的簡單運(yùn)用

    回調(diào)函數(shù)就是函數(shù)指針變量作為另外一個(gè)函數(shù)的參數(shù)而使用的一種應(yīng)用情形。本文就詳細(xì)的介紹一下C語言回調(diào)函數(shù)的簡單運(yùn)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C語言?for循環(huán)示例詳解

    C語言?for循環(huán)示例詳解

    本文將詳細(xì)介紹for循環(huán)的用法并提供相關(guān)的可編譯運(yùn)行的C代碼示例,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2023-06-06
  • 使用matlab繪制七夕表白玫瑰花束

    使用matlab繪制七夕表白玫瑰花束

    又是一年七夕節(jié)要到了,每年一次直男審美MATLAB繪圖大賽開始了,于是今年對我之前寫的老代碼進(jìn)行了點(diǎn)優(yōu)化組合,整了個(gè)花球變花束,感興趣的小伙伴可以動手試一試
    2023-08-08
  • C++中智能指針如何設(shè)計(jì)和使用

    C++中智能指針如何設(shè)計(jì)和使用

    智能指針(smart pointer)是存儲指向動態(tài)分配(堆)對象指針的類,用于生存期控制,能夠確保自動正確的銷毀動態(tài)分配的對象,防止內(nèi)存泄露,需要的朋友可以參考下
    2012-11-11
  • C++中的類與對象深度解析

    C++中的類與對象深度解析

    這篇文章主要為大家詳細(xì)介紹了C++中的類與對象,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++?OpenCV實(shí)現(xiàn)物體尺寸測量示例詳解

    C++?OpenCV實(shí)現(xiàn)物體尺寸測量示例詳解

    本文主要介紹了利用OpenCV對物體的尺寸進(jìn)行測量,即先定位到待測物體的位置,然后測量物體的寬高。感興趣的同學(xué)可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2022-01-01

最新評論