溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

發(fā)布時(shí)間:2023-03-07 13:56:14 來源:億速云 閱讀:125 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用”,在日常操作中,相信很多人在C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

庫文件

庫是一組預(yù)先編譯好的方法的集合,是計(jì)算機(jī)上的一類文件,提供給使用者一些開箱即用的變量、函數(shù)或類。庫文件分為靜態(tài)庫和動(dòng)態(tài)庫,靜態(tài)庫和動(dòng)態(tài)庫的區(qū)別體現(xiàn)在程序的鏈接階段。

一般來說,Windows的靜態(tài)庫文件擴(kuò)展名是 .lib,動(dòng)態(tài)庫文件擴(kuò)展名是 .dll (Dynamic-Link Libraries);Linux的靜態(tài)庫擴(kuò)展名是 .a,動(dòng)態(tài)庫擴(kuò)展名是 .so (Shared Object)。內(nèi)容一樣,都是將函數(shù)封裝,編譯后生成.o文件,將所有 .o 文件合并生成庫文件,再將供自己或他人調(diào)用。好處在于編譯后的庫文件的源代碼被加密,使用者看不到,可保密。

Linux系統(tǒng)存儲(chǔ)的庫的位置一般在:/lib 和 /usr/lib。 在 64 位的系統(tǒng)上有些庫也可能被存儲(chǔ)在/usr/lib64 下。庫的頭文件一般會(huì)被存儲(chǔ)在 /usr/include 下或其子目錄下。

Linux庫有兩種,一種是靜態(tài)庫,其命令規(guī)則為 libxxx.a;一種是共享庫,其命令規(guī)則為 libxxx.so。

靜態(tài)庫的生成

編輯三個(gè)文件,分別是hello.h、hello.c和main.c文件,文件內(nèi)容如下:

hello.h

#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H

hello.c

#include <stdio.h>
void hello(const char *name)
{
printf("Hello %s!\n", name);
}

main.c

#include "hello.h"
int main()
{
hello("everyone");
return 0;
}

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

因?yàn)闊o論是靜態(tài)庫文件還是動(dòng)態(tài)庫文件都是通過.o文件生成的,所以我們必須先利用gcc將.c文件編譯成對(duì)應(yīng)的.o文件,輸入以下命令實(shí)現(xiàn)

gcc -c hello.c

生成后的結(jié)果:

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

靜態(tài)庫文件名的命名規(guī)范是以 lib 為前綴,緊接著跟靜態(tài)庫名,擴(kuò)展名為.a。例如:我們將創(chuàng)建的靜態(tài)庫名為mian,則靜態(tài)庫文件名就是libmain.a。創(chuàng)建靜態(tài)庫用 ar 命令。

由.o 文件創(chuàng)建靜態(tài)庫

ar -crv libhyhello.a hello.o

創(chuàng)建靜態(tài)庫成功:

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

使用靜態(tài)庫

使用靜態(tài)庫有3中方法,三種方法所用語句不同,但是運(yùn)行結(jié)果相同。

方法一:

gcc -o hello main.c -L. -lhyhello

方法二:

gcc main.c libhyhello.a -o hello

方法三:

gcc -c main.c
gcc -o hello main.o libmyhello.a

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

我們刪除靜態(tài)庫文件試試公用函數(shù)hello 是否真的鏈接到目標(biāo)文件hello 中了。若刪除了靜態(tài)庫仍可以執(zhí)行,則表明連接到目標(biāo)文件hello中。

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

動(dòng)態(tài)庫的生成

由.o文件生成動(dòng)態(tài)庫。

生成.so文件,命令行:

gcc -shared -fPIC -o libhyhello.so hello.o

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

鏈接動(dòng)態(tài)庫到可執(zhí)行文件:

gcc -o hello main.c libhyhello.so

此時(shí),你可以做個(gè)實(shí)驗(yàn),把這個(gè)動(dòng)態(tài)庫先把這個(gè)動(dòng)態(tài)庫給挪到一個(gè)文件夾下,然后再來運(yùn)行程序:

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

你會(huì)發(fā)現(xiàn):動(dòng)態(tài)庫文件找不到,因此根本無法運(yùn)行程序。

那么程序一般情況下會(huì)在哪個(gè)路徑下找你的頭文件呢?可以通過輸入指令進(jìn)行查看:

env

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

這里可以看出:系統(tǒng)是在usr/local/lib這個(gè)路徑下去找頭文件的。

回到剛剛那個(gè)目錄下,將文件復(fù)制到 /usr/local/lib 中,在執(zhí)行hello:

mv hh/libhyhello.so /usr/local/lib/

輸出結(jié)果如下圖所示:

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

正常運(yùn)行。

GCC命令相同時(shí),會(huì)先執(zhí)行.a文件,還是會(huì)先執(zhí)行.so文件?

先刪除除.c和.h文件外的所有文件,然后再編譯形成.o文件,生成.o文件后,再由.o文件分別生成.a文件和.so文件。

執(zhí)行程序后,發(fā)現(xiàn)當(dāng)靜態(tài)庫和動(dòng)態(tài)庫同名時(shí),gcc 命令將優(yōu)先使用動(dòng)態(tài)庫,默認(rèn)去連/usr/lib 和/lib 等目錄中的動(dòng)態(tài)庫。

靜態(tài)庫與動(dòng)態(tài)庫的區(qū)別

每一個(gè)程序在使用靜態(tài)庫時(shí),都會(huì)將靜態(tài)庫文件拷貝一份添加到自身。如果有多個(gè)程序都要使用該靜態(tài)庫文件時(shí),都會(huì)給自身添加一份拷貝,這就導(dǎo)致會(huì)產(chǎn)生空間浪費(fèi)。在源文件較少時(shí)不明顯,但如果在一個(gè)項(xiàng)目中,靜態(tài)庫文件本身就比較大,并且使用該靜態(tài)庫文件的源程序很多,這就會(huì)造成大量內(nèi)存浪費(fèi)。

而動(dòng)態(tài)庫文件在被使用時(shí),會(huì)對(duì)所有想使用該動(dòng)態(tài)庫的源程序添加一個(gè)標(biāo)記,在程序執(zhí)行時(shí)再鏈接動(dòng)態(tài)庫文件使用。這就是動(dòng)態(tài)庫的優(yōu)點(diǎn),也是動(dòng)態(tài)庫被稱為共享庫的原因。

使用

靜態(tài)庫的使用

首先編輯四個(gè)文件,分別是A1.c、A2.c、A.h和test.c文件,文件內(nèi)容分別為:

A1.c

int add(int a,int b){
return a+b;
}

A2.c

int sub(int a,int b){
return a-b;
}

A.h

#ifndef A_H
#define A_H
int add(int a,int b);
int sub(int a,int b);
#endif

test.c

#include <stdlib.h>
#include "A.h"

int main(){
int a = 2,b=1;
printf("add is %d\n", add(a,b));
printf("sub is %d\n", sub(a,b));
}

將A1.c和A2.c都生成目標(biāo)文件

gcc -c A1.c A2.c

生成靜態(tài)庫.a文件

ar -crv libhyhello.a A1.o A2.o

使用.a文件創(chuàng)建可執(zhí)行.exe文件

gcc -o test test.c libhyhello.a 

./test

運(yùn)行結(jié)果如下圖所示:

動(dòng)態(tài)庫的使用

生成目標(biāo)文件

gcc -c -fpic A1.c A2.c

生成共享庫.so文件

gcc -shared *.o -o libhysofile.so

創(chuàng)建可執(zhí)行程序
提示:先要返回到根目錄下,賦值文件到 /usr/lib。

sudo cp libhysofile.so /usr/lib
gcc -o test test.c libhysofile.so
./test

運(yùn)行結(jié)果如下圖所示:

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

動(dòng)態(tài)庫的簡單應(yīng)用

將sub1.o和sub2.o的目標(biāo)文件生成一個(gè).so動(dòng)態(tài)庫文件:

gcc -shared -fPIC -o libtest.so A1.o A2.o

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

比較.o文件和.so文件的大小

ls-lht xya xyso

C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用

比較可以看出,動(dòng)態(tài)庫的文件較大一些。

到此,關(guān)于“C++靜態(tài)庫與動(dòng)態(tài)庫文件怎么生成和使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI