在windows下動態鏈結庫是以.dll字尾的檔案,而在linux中,是以.so作字尾的檔案。
動態鏈結庫的好處就是節省記憶體空間。
1、linux下建立動態鏈結庫
在使用gcc編譯程式時,只需加上-shared選項即可,這樣生成的執行程式即為動態鏈結庫。
例如有檔案:hello.c x.h main.c
編譯:gcc hello.c -fpic -o libhello.so
所以動態載入時是通過**拷貝的方式來滿足不同的呼叫,而不能達到真正的**段共享的目的.
將main.c與hello.so動態庫gcc main.c -l. -lhello -o main
一、動態鏈結庫
1.建立hello.so動態庫
#include
void hello(){
printf("hello world\n");
編譯:gcc -fpic -shared hello.c -o libhello.so
2.hello.h標頭檔案
void hello();
3.鏈結動態庫
#include
#include "hello.h"
int main(){
printf("call hello()");
hello();
複製**
編譯:gcc main.c -l. -lhello -o main這裡-l的選項是指定編譯器在搜尋動態庫時搜尋的路徑,告訴編譯器hello庫的位置。"."意思是當前路徑.
in function `main": main.c.text+0x1d): undefined reference to `hello"collect2: ld returned 1 exit status這是因為在鏈結hello動態庫時,編譯器沒有找到。
解決方法:
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的作用,將多個目標打包。程式ar配合引數-r建立乙個新庫libhello.a,並將命令列中列出的檔案打包入其中。這種方法,如果libhello.a已經存在,將會覆蓋現在檔案,否則將新建立。
3.鏈結靜態庫
gcc main.c -lhello -l. -static -o main這裡的-static選項是告訴編譯器,hello是靜態庫。
或者:gcc main.c libhello.a -l. -o main這樣就可以不用加-static
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」
gcc編譯動態庫和靜態庫
如果動態庫與靜態庫同時存在,未指明鏈結方式時,首先使用動態庫進行鏈結。我的 目錄 一 具體 1 include void a void b 2 lib include void a include void b 3 src include include include a.h include in...
gcc 編譯動態庫和靜態庫
cheungmine 2012 c程式編譯過程 windows7 cygwin gcc 在同乙個目錄下準備好下面3個檔案,其中3 2,3 3用來生成動態庫或靜態庫 主呼叫程式源 3 1 main.c cpp view plain copy print?main.c include include i...
GCC編譯動態和靜態鏈結庫
我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在linux中如何建立靜態...