中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++靜態庫與動態庫文件怎么生成和使用

發布時間:2023-03-07 13:56:14 來源:億速云 閱讀:132 作者:iii 欄目:開發技術

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

庫文件

庫是一組預先編譯好的方法的集合,是計算機上的一類文件,提供給使用者一些開箱即用的變量、函數或類。庫文件分為靜態庫和動態庫,靜態庫和動態庫的區別體現在程序的鏈接階段。

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

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

Linux庫有兩種,一種是靜態庫,其命令規則為 libxxx.a;一種是共享庫,其命令規則為 libxxx.so。

靜態庫的生成

編輯三個文件,分別是hello.h、hello.c和main.c文件,文件內容如下:

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++靜態庫與動態庫文件怎么生成和使用

因為無論是靜態庫文件還是動態庫文件都是通過.o文件生成的,所以我們必須先利用gcc將.c文件編譯成對應的.o文件,輸入以下命令實現

gcc -c hello.c

生成后的結果:

C++靜態庫與動態庫文件怎么生成和使用

靜態庫文件名的命名規范是以 lib 為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為mian,則靜態庫文件名就是libmain.a。創建靜態庫用 ar 命令。

由.o 文件創建靜態庫

ar -crv libhyhello.a hello.o

創建靜態庫成功:

C++靜態庫與動態庫文件怎么生成和使用

使用靜態庫

使用靜態庫有3中方法,三種方法所用語句不同,但是運行結果相同。

方法一:

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++靜態庫與動態庫文件怎么生成和使用

C++靜態庫與動態庫文件怎么生成和使用

我們刪除靜態庫文件試試公用函數hello 是否真的鏈接到目標文件hello 中了。若刪除了靜態庫仍可以執行,則表明連接到目標文件hello中。

C++靜態庫與動態庫文件怎么生成和使用

動態庫的生成

由.o文件生成動態庫。

生成.so文件,命令行:

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

C++靜態庫與動態庫文件怎么生成和使用

鏈接動態庫到可執行文件:

gcc -o hello main.c libhyhello.so

此時,你可以做個實驗,把這個動態庫先把這個動態庫給挪到一個文件夾下,然后再來運行程序:

C++靜態庫與動態庫文件怎么生成和使用

你會發現:動態庫文件找不到,因此根本無法運行程序。

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

env

C++靜態庫與動態庫文件怎么生成和使用

這里可以看出:系統是在usr/local/lib這個路徑下去找頭文件的。

回到剛剛那個目錄下,將文件復制到 /usr/local/lib 中,在執行hello:

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

輸出結果如下圖所示:

C++靜態庫與動態庫文件怎么生成和使用

正常運行。

GCC命令相同時,會先執行.a文件,還是會先執行.so文件?

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

執行程序后,發現當靜態庫和動態庫同名時,gcc 命令將優先使用動態庫,默認去連/usr/lib 和/lib 等目錄中的動態庫。

靜態庫與動態庫的區別

每一個程序在使用靜態庫時,都會將靜態庫文件拷貝一份添加到自身。如果有多個程序都要使用該靜態庫文件時,都會給自身添加一份拷貝,這就導致會產生空間浪費。在源文件較少時不明顯,但如果在一個項目中,靜態庫文件本身就比較大,并且使用該靜態庫文件的源程序很多,這就會造成大量內存浪費。

而動態庫文件在被使用時,會對所有想使用該動態庫的源程序添加一個標記,在程序執行時再鏈接動態庫文件使用。這就是動態庫的優點,也是動態庫被稱為共享庫的原因。

使用

靜態庫的使用

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

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都生成目標文件

gcc -c A1.c A2.c

生成靜態庫.a文件

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

使用.a文件創建可執行.exe文件

gcc -o test test.c libhyhello.a 

./test

運行結果如下圖所示:

動態庫的使用

生成目標文件

gcc -c -fpic A1.c A2.c

生成共享庫.so文件

gcc -shared *.o -o libhysofile.so

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

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

運行結果如下圖所示:

C++靜態庫與動態庫文件怎么生成和使用

動態庫的簡單應用

將sub1.o和sub2.o的目標文件生成一個.so動態庫文件:

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

C++靜態庫與動態庫文件怎么生成和使用

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

ls-lht xya xyso

C++靜態庫與動態庫文件怎么生成和使用

比較可以看出,動態庫的文件較大一些。

到此,關于“C++靜態庫與動態庫文件怎么生成和使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

东至县| 海南省| 阿克陶县| 福安市| 益阳市| 进贤县| 津南区| 信丰县| 佳木斯市| 阿克陶县| 孝昌县| 泸西县| 南京市| 衡阳县| 桂林市| 金昌市| 灌南县| 嘉善县| 宁安市| 义乌市| 闽侯县| 扎兰屯市| 德清县| 东宁县| 莆田市| 共和县| 延边| 马尔康县| 长岛县| 友谊县| 灌南县| 贵德县| 公安县| 伊通| 龙南县| 营口市| 比如县| 东宁县| 云安县| 大理市| 肇源县|