ø
不同於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 中匯出函式...