簡單地說,庫(Library)就是一組已經(jīng)寫好了的函數(shù)和變量,、是為了能夠提高程序開發(fā)效率和運行效率而設計的,。庫分為靜態(tài)庫(Static Library)和共享庫(Shared library)兩類。靜態(tài)庫文件的擴展名是.a,,共享庫文件的擴展名是.so (1)靜態(tài)庫
不同之處就是加載的方法不同,,動態(tài)連接庫是程序在啟動的時候,在LD_LIBRARY_PATH環(huán)境變量中尋找動態(tài)連接庫,,可以export LD_LIBRARY_PATH=path來設置動態(tài)鏈接庫查找路徑,。可以使用ldd命令查看一個程序在啟動時加載的動態(tài)連接庫,。而動態(tài)加載庫可以用程序的方法來控制什么時候加載,。
靜態(tài)庫使用示例 //hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name); #endif
//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; } # gcc -c hello.c (生成hello.o) # ar crv libmyhello.a hello.o(生成libmyhello.a) ar(archive,歸檔的意思)可以把.o文件打包成一個.a文件 # gcc main.c libmyhello.a -o main(連接libmyhello.a,,也可以用gcc -o out main.c -L. -lmyhello) 其中 -L指定靜態(tài)函數(shù)庫的位置供查找,,注意L后面還有".",表示靜態(tài)函數(shù)庫在本目錄下查找,。 -l則指定了靜態(tài)函數(shù)庫名,,由于靜態(tài)函數(shù)庫的命名方式是lib***.a,其中的lib和.a忽略,。 可用ar -t libmyhello.a來查看靜態(tài)庫的內(nèi)容 動態(tài)鏈接庫使用 #gcc -shared -fPIC -o libmyhello.so hello.o #gcc main.c libmyhello.so -o main(gcc -o main main.c -L. -lmyhello) 可用nm -D libavformat.so查看共享庫的內(nèi)容 arm平臺下(X86)arm-linux-readelf -d input_uvc.so (板卡上)/lib/ld.so.2 –list input_uvc.so查看應用程序的共享庫 root@cheney:lib_test# ls hello.c hello.h hello.o main main.a_test main.c root@cheney:lib_test# gcc -shared -fPIC -o libmyhello.so hello.o root@cheney:lib_test# ls hello.c hello.h hello.o libmyhello.so main main.a_test main.c root@cheney:lib_test# gcc -o main main.c -L. -lmyhello root@cheney:lib_test# ls hello.c hello.h hello.o libmyhello.so main main.a_test main.c root@cheney:lib_test# ldd libmyhello.so linux-gate.so.1 => (0xb7807000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7691000) /lib/ld-linux.so.2 (0xb7808000) root@cheney:lib_test# ldd main linux-gate.so.1 => (0xb780e000) libmyhello.so => not found libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb769b000) /lib/ld-linux.so.2 (0xb780f000) root@cheney:lib_test# ./main ./main: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory root@cheney:lib_test# mv libmyhello.so /lib/ root@cheney:lib_test# ldd main linux-gate.so.1 => (0xb7821000) libmyhello.so => /lib/libmyhello.so (0xb780e000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb76ab000) /lib/ld-linux.so.2 (0xb7822000) root@cheney:lib_test# ./main hello everyone! root@cheney:lib_test# 動態(tài)加載庫
-shared 該選項指定生成動態(tài)連接庫(讓連接器生成T類型的導出符號表,,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接,。相當于一個可執(zhí)行文件 LD_LIBRARY_PATH:這個環(huán)境變量指示動態(tài)連接器可以裝載動態(tài)庫的路徑,。 |
|
來自: zhouADNjj > 《Linux 相關》