Linux靜態和動態鏈結庫使用例項

2021-05-22 17:54:06 字數 1333 閱讀 7165

ø

不同於win32dll

,linux

標準物件中的所有函式都是直接匯出的,都可以被呼叫程式所訪問。也就是說不用標頭檔案即可被匯出。

ø靜態和動態的區別

靜態庫的**在編譯時已經進入被包含到目標檔案了;而動態庫的**要在目標檔案執行的時候才會被包含進去,在編譯的時候只是對動態庫進行乙個鏈結。

//fun1.h

#include

void fun1printf();

//fun1.c

#include "fun1.h"

void fun1printf()

//fun2.h

#include

void fun2printf();

//fun2.c

#include "fun2.h"

void fun2printf()

///staticcall.c

#include

int main()

/////makefile

all:staticlib main

staticlib:fun1.c fun2.c

gcc -c -o fun1.o fun1.c

gcc -c -o fun2.o fun2.c

ar cqs libfun.a fun1.o fun2.o

main:staticcall.c libfun.a

gcc -o staticcall staticcall.c -l ./-lfun

生成靜態鏈結庫的命令是

ar cqs

。所有檔案同靜態鏈結庫,只是

makefile

編寫不一樣。

all:sharedlib sharedcall

sharedlib:fun1.c fun2.c

gcc -fpic -c fun1.c -o fun1.o

gcc -fpic -c fun2.c -o fun2.o

gcc -shared fun1.o fun2.o -o libfun.so

sharedcall:

gcc -o sharedcall -l ./ -lfun sharedcall.c

編譯生成動態鏈結庫的檔案時,必須加上

-fpic

,position independent code

(位址無關編碼)。

在執行程式之前,必須:

øexport ld_library_path=$ld_library_path:/root/ccode/dll/ø在

/etc/ld.so.conf

中新增/root/ccode/dll/

路徑

linux 編譯靜態鏈結庫和動態鏈結庫

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在linux中如何建立靜態...

靜態鏈結庫和動態鏈結庫

其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...

靜態鏈結庫和動態鏈結庫

靜態鏈結庫 win32 static library 呼叫libtest.lib 動態dll win32 dynamic link library 跟librest的生成是一樣的 動態呼叫 成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列 dll 中匯出函式...