Ⅰ linux動態庫和靜態庫的區別
接靜態庫其實從某種意義上來說只不過它操作的對象是目標代碼而不是源碼而已。因為靜態庫被鏈接後庫就直接嵌入可執行文件中了,這樣就帶來了兩個問題。
(1)首先就是系統空間被浪費了。如果多個程序鏈接了同一個庫,則每一個生成的可執行文件就都會有一個庫的副本,必然會浪費系統空間。
(2)再者,一旦發現了庫中有bug,挽救起來就比較麻煩了。必須一一把鏈接該庫的程序找出來,然後重新編譯。
而動態庫的出現正彌補了靜態庫的以上弊端。因為動態庫是在程序運行時被鏈接的,所以磁碟上只須保留一份副本,因此節約了磁碟空間。如果發現了bug或要升級也很簡單,只要用新的庫把原來的替換掉就行了。
但是靜態庫的優點:
編譯後的執行程序不需要外部的函數庫支持,因為所有使用的函數都已經被編譯進去了。
靜態庫的名字一般是libxxx.a(Linux)
動態庫的名字一般是libxxx.so(Linux),有時候也是 libxxx.so.major.minor,xxxx是該lib的名稱,major是主版本號, minor是副版本號。
Ⅱ linux下的靜態庫創建與查看,及如何查看某個可執行依賴於哪些動態庫
創建靜態庫:
ar -rcs test.a *.o
查看靜態庫:
ar -tv test.a
解壓靜態庫:
ar -x test.a
查看程序依賴的動態庫:
readelf -a xxx|grep library
如:可以看到,下面的交叉程序hello執行依賴於如下兩個動態庫。
rebi@ubuntu:~/test$ arm-none-linux-gnueabi-readelf -a hello|grep "library"
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
rebi@ubuntu:~/test$
或者:readelf -l hello 即可。
nm xxx 查看符號
其中,T表示代碼段,U表示在其它地方定義,所以需要確保必須在某個.o或庫里被定義過。
Ⅲ linux環境下,靜態庫的依賴關系怎麼查
創建靜態庫: ar -rcs test.a *.o 查看靜態庫: ar -tv test.a 解壓靜態庫: ar -x test.a 查看程序依賴態庫: readelf -a xxx|grep library :看面交叉程序hello執行依賴於兩態庫 rebi@ubuntu:~/test$ arm-none-linux-gnueabi-readelf -a hello|grep "library" 0x0000000依 (NEEDED) Shared library: [libgcc_s.so.依] 0x0000000依 (NEEDED) Shared library: [libc.so.陸] rebi@ubuntu:~/test$ 或者:readelf -l hello 即 nm xxx 查看符號 其T表示代碼段U表示其定義所需要確保必須某.o或庫定
Ⅳ linux靜態庫怎麼編譯
linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so
libhello.a
為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如:
libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln
-s
libhello.so.1.0
libhello.so.1
ln
-s
libhello.so.1
libhello.so
動態庫和靜態庫的區別:
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
兩種庫的編譯產生方法:
第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫:
/*
hello.c
*/
#include
void
sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
gcc
-c
hello.c
-o
hello.o
1.連接成靜態庫
連接成靜態庫使用ar命令,其實ar是archive的意思
$ar
cqs
libhello.a
hello.o
2.連接成動態庫
生成動態庫用gcc來完成,由於可能存在多個版本,因此通常指定版本號:
$gcc
-shared
-wl,-soname,libhello.so.1
-o
libhello.so.1.0
hello.o
另外再建立兩個符號連接:
$ln
-s
libhello.so.1.0
libhello.so.1
$ln
-s
libhello.so.1
libhello.so
這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc
-shared
參數使其生成是動態庫而不是普通執行程序。
-wl
表示後面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有
soname名字的文件,%b
Ⅳ linux下怎麼 調用 和生成 靜態庫
Linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如: libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。 ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so 動態庫和靜態庫的區別: 當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。 兩種庫的編譯產生方法: 第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫: /* hello.c */ #include void sayhello() { printf("hello,world\n"); } 用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等
Ⅵ linux 怎麼指定靜態鏈接靜態庫
創建靜態庫: ar -rcs test.a *.o 查看靜態庫: ar -tv test.a 解壓靜態庫: ar -x test.a 查看程序依賴的動態庫: readelf -a xxx|grep library 如:可以看到,下面的交叉程序hello執行依賴於如下兩個動態庫。 rebi@ubuntu:~/test$ arm-none-li...
Ⅶ linux靜態庫和共享庫的區別
linux下的庫有兩種:靜態庫和共享庫(動態庫)。二者的不同點在於代碼被載入的時刻不同。
靜態庫在程序編譯時會被連接到目標代碼中,目標程序運行時將不再需要該動態庫,移植方便,體積較大,但是浪費空間和資源,因為所有相關的對象文件與牽涉到的庫被鏈接合成一個可執行文件。
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行時才被載入,因此體積較小,可以實現進程間的資源共享,甚至可以真正做到鏈接載入完全由程序員在程序代碼中控制,另外將一些程序的升級變得簡單,但是在程序運行時需要動態庫存在。
Ⅷ linux a 靜態庫 怎麼設置
Linux的靜態庫文件並不需要設置啊,編譯鏈接.a靜態庫文件時只需要加上.a文件的完整路徑就可以了,比如:
gcc
-o
hello
hello.c
/usr/lib/libm.a
只有編譯鏈接動態庫才需要用-L選項來設置動態庫的搜索路徑,比如這個命令:
gcc
-o
hello
hello.c
-L/usr/openssl/lib
-lcrypto
Ⅸ linux 動態庫轉為靜態庫
libc 和 lib-linux 這兩個最基本的庫都沒有,請問其他電腦上跑的是linux嗎?沒有這兩個庫,沒有一個程序可以運行。
另外,不可能把已有的動態庫「直接」轉換成靜態庫,你只能從源碼編譯出靜態庫。
Ⅹ 如何使用靜態庫 linux
創建並使用靜態庫
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數,作為程序入口;test.c中包含main函數中需要用到的函數。
vi test.h test.c main.c
第二步:將test.c編譯成目標文件。
gcc -c test.c
如果test.c無誤,就會得到test.o這個目標文件。
第三步:由.o文件創建靜態庫。
ar rcs libtest.a test.o
第四步:在程序中使用靜態庫。
gcc -o main main.c -L. -ltest
因為是靜態編譯,生成的執行文件可以獨立於.a文件運行。
第五步:執行。
./main
示例四 創建並使用動態庫
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數,作為程序入口;test.c中包含main函數中需要用到的函數。
vi test.h test.c main.c
第二步:將test.c編譯成目標文件。
gcc -c test.c
前面兩步與創建靜態庫一致。
第三步:由.o文件創建動態庫文件。
gcc -shared -fPIC -o libtest.so test.o
第四步:在程序中使用動態庫。
gcc -o main main.c -L. -ltest
當靜態庫和動態庫同名時,gcc命令將優先使用動態庫。
第五步:執行。
LD_LIBRARY_PATH=. ./main
示例五 查看靜態庫中的文件
[root@node56 lib]# ar -t libhycu.a
base64.c.o
binbuf.c.o
cache.c.o
chunk.c.o
codec_a.c.o