您好,登錄后才能下訂單哦!
這篇文章主要介紹“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; }
因為無論是靜態庫文件還是動態庫文件都是通過.o文件生成的,所以我們必須先利用gcc將.c文件編譯成對應的.o文件,輸入以下命令實現
gcc -c hello.c
生成后的結果:
靜態庫文件名的命名規范是以 lib 為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為mian,則靜態庫文件名就是libmain.a。創建靜態庫用 ar 命令。
由.o 文件創建靜態庫
ar -crv libhyhello.a hello.o
創建靜態庫成功:
使用靜態庫
使用靜態庫有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
我們刪除靜態庫文件試試公用函數hello 是否真的鏈接到目標文件hello 中了。若刪除了靜態庫仍可以執行,則表明連接到目標文件hello中。
由.o文件生成動態庫。
生成.so文件,命令行:
gcc -shared -fPIC -o libhyhello.so hello.o
鏈接動態庫到可執行文件:
gcc -o hello main.c libhyhello.so
此時,你可以做個實驗,把這個動態庫先把這個動態庫給挪到一個文件夾下,然后再來運行程序:
你會發現:動態庫文件找不到,因此根本無法運行程序。
那么程序一般情況下會在哪個路徑下找你的頭文件呢?可以通過輸入指令進行查看:
env
這里可以看出:系統是在usr/local/lib這個路徑下去找頭文件的。
回到剛剛那個目錄下,將文件復制到 /usr/local/lib 中,在執行hello:
mv hh/libhyhello.so /usr/local/lib/
輸出結果如下圖所示:
正常運行。
先刪除除.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
運行結果如下圖所示:
動態庫的簡單應用
將sub1.o和sub2.o的目標文件生成一個.so動態庫文件:
gcc -shared -fPIC -o libtest.so A1.o A2.o
比較.o文件和.so文件的大小
ls-lht xya xyso
比較可以看出,動態庫的文件較大一些。
到此,關于“C++靜態庫與動態庫文件怎么生成和使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。