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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下的静态库与动态库

發布時間:2023/12/18 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下的静态库与动态库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 靜態庫
    • 定義:
    • 生成及使用方法:
    • 靜態庫的優缺點
  • 動態庫
    • 定義:
    • 生成及使用方法:
    • 動態庫優缺點:

靜態庫

先說說我們為什么需要庫?
當有些代碼我們大量會在程序中使用比如(scanf,printf等)這些函數我們需要在程序中頻繁使用,于是我們就把這些代碼編譯為庫文件,在需要使用時我們直接鏈接即可。

定義:

?程序在編譯時把靜態庫的代碼鏈接到可執行程序中,在代碼運行時不再需要靜態庫。(簡單理解就是把一堆 .o 文件打包到一起,當需要用到就讓我們的程序鏈接進來)

生成及使用方法:

??這里用加減乘除來舉例示意:

//創建所需文件 [root@localhost ku]# touch add.c add.h sub.c sub.h mul.c mul.h dev.c dev.h main.c [root@localhost ku]# ls add.c add.h dev.c dev.h main.c mul.c mul.h sub.c sub.h [root@localhost ku]# //編寫所有文件代碼 //add.c #include"add.h" int add(int x,int y) {return x+y; } //add.h#ifndef __ADD_H__ #define __ADD_H__int add(int x,int y); #endif // __ADD_H__ //sub.c #include"sub.h" int sub(int x,int y) {return x-y; } //sub.h #ifndef __SUB_H__ #define __SUB_H__int sub(int x,int y); #endif // __SUB_H__ //mul.c #include"mul.h"int mul(int x,int y) {return x*y; } //mul.h #ifndef __MUL_H__ #define __MUL_H__int mul(int x,int y); #endif //__MUL_H__ //dev.c #include"dev.h"int dev(int x,int y) {return x/y; } //dev.h #ifndef __DEV_H__ #define __DEV_H__int dev(int x,int y); #endif // __DEV_H__ //main.c #include<stdio.h> #include"add.h" #include"sub.h" #include"mul.h" #include"dev.h"int main() {int a,b;scanf("%d%d",&a,&b);printf("%d + %d = %d\n",a,b,add(a,b));printf("%d - %d = %d\n",a,b,sub(a,b));printf("%d * %d = %d\n",a,b,mul(a,b));printf("%d / %d = %d\n",a,b,dev(a,b)); return 0; }//編譯源文件 [root@localhost ku]# ls add.c add.h dev.c dev.h main.c mul.c mul.h sub.c sub.h [root@localhost ku]# gcc -c *.c //把所有.c文件生成.o文件 [root@localhost ku]# ls add.c add.h add.o dev.c dev.h dev.o main.c main.o mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# rm main.o -rf //刪除多余的.o文件 [root@localhost ku]# ls add.c add.h add.o dev.c dev.h dev.o main.c mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# //生成靜態庫 [root@localhost ku]# ar -rc libmycal.a *.o [root@localhost ku]# ls add.c add.h add.o dev.c dev.h dev.o libmycal.a main.c mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# //查看靜態庫 [root@localhost ku]# ls add.c add.h add.o dev.c dev.h dev.o libmycal.a main.c mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# ar -tv libmycal.a rw-r--r-- 0/0 683 Apr 26 20:46 2018 add.o rw-r--r-- 0/0 683 Apr 26 20:46 2018 dev.o rw-r--r-- 0/0 679 Apr 26 20:46 2018 mul.o rw-r--r-- 0/0 687 Apr 26 20:46 2018 sub.o [root@localhost ku]# //鏈接靜態庫生成可執行文件 [root@localhost ku]# ls add.c add.h add.o dev.c dev.h dev.o libmycal.a main.c mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# gcc main.c -L. -lmycal [root@localhost ku]# ls add.c add.h add.o a.out dev.c dev.h dev.o libmycal.a main.c mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# //運行結果 [root@localhost ku]# ls add.c add.h add.o a.out dev.c dev.h dev.o libmycal.a main.c mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# ./a.out 8 3 8 + 3 = 11 8 - 3 = 5 8 * 3 = 24 8 / 3 = 2 [root@localhost ku]#

以上是整個靜態庫的生成及運用過程
總結起來就3步驟:

?首先將源文件編譯成目標文件:gcc –c 源文件
?生成靜態庫:ar –rc lib(庫名).a 目標文件
?使用靜態庫:gcc main.c -L(庫的路徑) -l(庫名)

靜態庫的優缺點

 優點:

?1. 省空間:linker只會復制你用到的objects。
?2. 打包簡單。

 缺點:

?1、如果靜態庫中有全局變量,那么在幾個模塊中使用,將會導致全局變量有不同的值,這是非常嚴重的問題。
?2、靜態庫編譯時,不會進行鏈接檢查,所以這么多靜態庫的問題,在生成靜態庫階段檢查不出來。
?3、幾個模塊,引用同一靜態庫,如果有一模塊沒有編譯到,會引起巨大的差異導致問題。
?4.產生大量的庫文件文件會占空間

動態庫

定義:

?程序在運行時才去鏈接動態庫的代碼,多個程序共享使用庫的代碼。
?一個與動態庫鏈接的可執行文件僅包含他用到的函數入口地址的一個表,而不是外部函數所在目標文件的機器碼。

生成及使用方法:

事例程序和上面一樣,這里只寫出操作步驟

[root@localhost ku]# ls add.c add.h dev.c dev.h main.c mul.c mul.h sub.c sub.h [root@localhost ku]# gcc -c -fpic *.c // -fpic 表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。 [root@localhost ku]# ls add.c add.h add.o dev.c dev.h dev.o main.c main.o mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# rm main.o -rf [root@localhost ku]# ls add.c add.h add.o dev.c dev.h dev.o main.c mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# gcc -shared -o libmycal.so *.o [root@localhost ku]# ls add.c add.h add.o dev.c dev.h dev.o libmycal.so main.c mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# gcc main.c -L. -lmycal //-L. 表示要連接的庫在當前目錄中 [root@localhost ku]# ls add.c add.h add.o a.out dev.c dev.h dev.o libmycal.so main.c mul.c mul.h mul.o sub.c sub.h sub.o [root@localhost ku]# ./a.out ./a.out: error while loading shared libraries: libmycal.so: cannot open shared object file: No such file or directory [root@localhost ku]# cp libmycal.so /lib/ //把動態庫移動到系統庫文件下 [root@localhost ku]# ls add.c add.h add.o a.out dev.c dev.h dev.o libmycal.so main.c mul.c mul.h mul.o sub.c sub.h sub.o //運行結果 [root@localhost ku]# ./a.out 8 6 8 + 6 = 14 8 - 6 = 2 8 * 6 = 48 8 / 6 = 1 //第二種方法,更改庫路徑 [root@localhost ku]# ./main ./main: error while loading shared libraries: libmycal.so: cannot open shared object file: No such file or directory [root@localhost ku]# vim /etc/ld.so.conf.d/mycal.conf //在創建的文件里寫上庫的路徑 //寫好路徑之后刷新緩沖區 [root@localhost ku]# ldconfig //運行結果 [root@localhost ku]# ./main 8 6 8 + 6 = 14 8 - 6 = 2 8 * 6 = 48 8 / 6 = 1

動態庫優缺點:

優點:

?1 .共享內存
?2 .獨立升級組件(插件安裝,軟件更新)
?3.可以顯示動態加載

缺點:

?1.當系統中多個應用程序都用了一個動態鏈接庫,但是要求的版本不同,這時動態鏈接庫之間就會相互干擾。
?2.性能開銷。動態鏈接庫為了做到“共享代碼,但是不共享數據”,引入了不小的開銷,調用動態鏈接庫中的函數,需要好幾次間接內存訪問才能走到函數入口,全局數據也是。

轉載于:https://www.cnblogs.com/zhonglongbo/p/8967954.html

總結

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

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