2 靜態庫和動態庫

2022-06-11 17:18:12 字數 2929 閱讀 3526

靜態庫(.a):程式在編譯鏈結的時候把庫的**鏈結到可執行檔案中。程式執行的時候將不再需要靜態庫,在linux系統之下字尾名為.a  

動態庫(也叫共享庫)

2、在可執行檔案開始執行以前,外部函式的機器碼由作業系統從磁碟上的該共享庫中複製到記憶體中,這個過程稱為動態鏈結(dynamic linking)

3、共享庫可以在多個程式間共享,所以動態鏈結使得可執行檔案更小,節省了磁碟空間。作業系統採用虛擬記憶體機制允許物理記憶體中的乙份共享庫被要用到該庫的所有程序共用,節省了記憶體和磁碟空間。

myadd.h

extern

int myadd(int a, int b);

myadd.c

int myadd(int a, int

b)

test.c

include #include 

"../inc/myadd.h

"int

main()

1. 生成.o檔案

gcc -c myadd.c -o myadd.o

2. 將.o檔案壓成.a檔案

ar rcs libmyadd.a myadd.o

gcc -i../inc -l../ main.c -o main.exe -lmyadd

備註:

.a檔案實際上是.o檔案的集合,打個包而已;

ar是gnu歸檔工具,rcs表示(replace and create);

-lmyadd 表示要鏈結libmyadd.so或者libmyadd.a庫檔案,如果這兩個庫同時存在,優先鏈結libmyadd.so這個動態庫。

1.生成動態庫

-share的意思是告訴gcc編譯器,把.c編譯成.o然後壓成.so

-fpic是意思是生成的.so檔案在鏈結時與位置無關,此選項必加

gcc -shared -fpic -i./inc ./src/myadd.c -o libmyadd.so

2.鏈結動態庫

gcc -l. main.c -o main.exe -lmyadd

ps: 若執行生成的 main.exe 出現下列錯誤:

error while loading shared libraries: libmyadd.so: cannot open shared object file: no such file or directory 則說明系統不知道libmyadd.so放在哪個目錄下

可以cd到使用者目錄下,如:home/yongdaimi,執行

vim .bashrc

在.bashrc的尾部新增下列**,指定共享庫的訪問路徑即可。:號左邊的.代表共享庫可以在main.exe所在的當前目錄,也可以在使用者目錄的lib資料夾下(home/yongdaimi/lib)

export ld_library_path=.:$home/lib:/usr/lib:$ld_library_path

備註:

1.在實際開發過程中,共享庫的所在位置是很重要的,可以通過ldd main.exe檢視可執行程式鏈結的各個共享庫的位置

ldd main.exe

linux-vdso.so.1 => (0x00007fffe27fe000)

libmyadd.so =>/home/yongdaimi/lib/libmyadd.so (0x00007f5d8734f000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5d86f74000)

/lib64/ld-linux-x86-64.so.2 (0x00007f5d87553000)

2.也可以通過nm 命令檢視當前動態庫里包含的函式列表

nm libmyadd.so

0000000000201030 b __bss_start

0000000000201030 b completed.6973

w __cxa_finalize@@glibc_2.2.5

0000000000000590 t deregister_tm_clones

0000000000000600 t __do_global_dtors_aux

0000000000200e08 t __do_global_dtors_aux_fini_array_entry

0000000000201028 d __dso_handle

0000000000200e18 d _dynamic

0000000000201030 d _edata

0000000000201038 b _end

000000000000068c t _fini

0000000000000640 t frame_dummy

0000000000200e00 t __frame_dummy_init_array_entry

0000000000000718 r __frame_end__

0000000000201000 d _global_offset_table_

w __gmon_start__

0000000000000540 t _init

w _itm_deregistertmclonetable

w _itm_registertmclonetable

0000000000200e10 d __jcr_end__

0000000000200e10 d __jcr_list__

w _jv_registerclasses

0000000000000675 t myadd

00000000000005c0 t register_tm_clones

0000000000201030 d __tmc_end__

庫(靜態庫和動態庫)

一 靜態庫 以c語言的形式生成庫 h中extern c int add int int extern c int sub int int 二.測試靜態庫 將.h和.lib放入 h ifdef cplusplus c 程式設計師用c的方式開啟 extern c int add int int exte...

靜態庫和動態庫

一。靜態庫 靜態庫的優點在於使用簡單,編譯快速。靜態庫在應用程式生成時,已經編譯成為可重定位的目標檔案,因此可以不必再編譯,節省編譯時間,以最短的時間生成可執行程式。步奏 a。建立靜態庫 1 在編輯器中編輯其靜態庫函式 static lib.c 2 在shell中編譯該原始檔,生成乙個可重定位的目標...

靜態庫和動態庫

靜態庫 lib 中相當於存放了所有的源 包括他引入的其他靜態lib檔案.其實是所有cpp編譯後對應的.obj檔案的打包 所以靜態lib都比較大。動態庫dll也有lib但是這個lib,只是用來幫助程式在鏈結時定位dll中的函式的位址的。所以會在exe載入時才重定位函式的位址。重定位就是根據鏈結的這個l...