c語言生成靜態庫.a和動態庫.so
阿新 • • 發佈:2019-02-13
在windows下動態連結庫是以.dll字尾的檔案,二在Linux中,是以.so作字尾的檔案。
動態連結庫的好處就是節省記憶體空間。
1、Linux下建立動態連結庫
在使用GCC編譯程式時,只需加上-shared選項即可,這樣生成的執行程式即為動態連結庫。
例如有檔案:hello.c x.h main.c
其中-fPIC選項的作用是:表示編譯為位置獨立的程式碼,不用此選項的話編譯後的程式碼是位置相關的,
所以動態載入時是通過程式碼拷貝的方式來滿足不同的呼叫,而不能達到真正的程式碼段共享的目的.
將main.c與hello.so動態庫
2.hello.h標頭檔案
3.連結動態庫
解決方法:
call hello()
2.把目標文件歸檔
3.連結靜態庫
或者:
linux-gate.so.1 => (0x00efd000)
libhello.so => /usr/lib/libhello.so (0x00f6b000)
libc.so.6 => /lib/libc.so.6 (0x001a5000)
/lib/ld-linux.so.2 (0x00eb8000)
如果目標程式沒有連結動態庫,則列印“not a dynamic executable”
動態連結庫的好處就是節省記憶體空間。
1、Linux下建立動態連結庫
在使用GCC編譯程式時,只需加上-shared選項即可,這樣生成的執行程式即為動態連結庫。
例如有檔案:hello.c x.h main.c
- 編譯:gcc hello.c -fPIC -o libhello.so
其中-fPIC選項的作用是:表示編譯為位置獨立的程式碼,不用此選項的話編譯後的程式碼是位置相關的,
所以動態載入時是通過程式碼拷貝的方式來滿足不同的呼叫,而不能達到真正的程式碼段共享的目的.
將main.c與hello.so動態庫
- gcc main.c -L. -lhello -o main
一、動態連結庫
1.建立hello.so動態庫
- #include <stdio.h>
- void hello(){
- printf("hello world\n");
- }
- 編譯:gcc -fPIC -shared hello.c -o libhello.so
2.hello.h標頭檔案
- void hello();
3.連結動態庫
- #include <stdio.h>
- #include "hello.h"
- int main(){
- printf("call hello()");
- hello();
- }
- 編譯:gcc main.c -L. -lhello -o main
3.編譯成夠後執行./main,會提示:
- In function `main':
- main.c:(.text+0x1d): undefined reference to `hello'
- collect2: ld returned 1 exit status
解決方法:
- sudo cp libhello.so /usr/lib/
call hello()
二、靜態庫
檔案有:main.c、hello.c、hello.h
1.編譯靜態庫hello.o:
- gcc hello.c -o hello.o #這裡沒有使用-shared
2.把目標文件歸檔
- ar -r libhello.a hello.o #這裡的ar相當於tar的作用,將多個目標打包。
3.連結靜態庫
- gcc main.c -lhello -L. -static -o main
或者:
- gcc main.c libhello.a -L. -o main
4.執行./main
輸出:call hello()
三、藉助自帶的ldd實現程式來分析動態庫搜尋情況
ldd main
結果:linux-gate.so.1 => (0x00efd000)
libhello.so => /usr/lib/libhello.so (0x00f6b000)
libc.so.6 => /lib/libc.so.6 (0x001a5000)
/lib/ld-linux.so.2 (0x00eb8000)
如果目標程式沒有連結動態庫,則列印“not a dynamic executable”