動態庫使用方法

2021-08-21 03:24:02 字數 1974 閱讀 7303

動態庫api介紹

#include

void *dlopen(const char *filename, intflag);

char *dlerror(void);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

dlopen

以指定模式開啟指定的動態連線庫檔案,並返回乙個控制代碼給呼叫程序,開啟模式如下:

rtld_lazy 

暫緩決定,等有需要時再解出符號

rtld_now 

立即決定,返回前解除所有未決定的符號。

dlerror

返回出現的錯誤

dlsym

通過控制代碼和連線符名稱獲取函式名或者變數名

dlclose

來解除安裝開啟的庫

dlopen

開啟模式如下:

測試程式

add.h

int add(int a, int b);

add.c

#include "add.h"

#include

int add(int a, int b)

returna + b;

編譯動態庫

user2@rlk-buildsrv-tf30:~/projects/study/code/dlopen/dll$gcc -fpic -shared add.c -o libadd.so

user2@rlk-buildsrv-tf30:~/projects/study/code/dlopen/dll$ls

add.c add.h  libadd.so  main.c

main.c

#include

#include

#include

#include "add.h"

#define share_lib_path        "./libadd.so"

typedef int(* handler_t)(int a, int b);

int main(void)

inta = 2;

intb = 3;

char*error;

void*dlhandler = null;

handler_thandler = null;

dlhandler= dlopen(share_lib_path, rtld_lazy);

if(!dlhandler){

fprintf(stderr,"%s\n", dlerror());

exit(exit_failure);

dlerror();

*(void**) (&handler) = dlsym(dlhandler, "add");

if((error = dlerror()) != null)  {

fprintf(stderr,"%s\n", error);

exit(exit_failure);

printf("lkl dladd: %d\n", (*handler)(2,7));

//printf("a+b= %d\n", (add(a, b)));          //不能直接呼叫add函式,否則會報編譯錯誤

return0;

user2@rlk-buildsrv-tf30:~/projects/study/code/dlopen/dll$gcc -rdynamic -o main main.c -ldl

user2@rlk-buildsrv-tf30:~/projects/study/code/dlopen/dll$ls

add.c add.h  libadd.so  main main.c

編譯和執行結果

user2@rlk-buildsrv-tf30:~/projects/study/code/dlopen/dll$./main

lkl dladd: 9

靜態庫和動態庫詳解及使用方法

使用和生成庫 基本概念 庫有動態與靜態兩種,動態通常用.so為字尾,靜態用.a為字尾。例如 libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾,例如 libhello.so.1.0,由於程式連線預設以.so為檔案字尾名。所以為了使用這些庫,...

動態語句的使用方法

雖然是 但經過鄙人親自操作,而後有感 生成測試表ta if not object id ta is null drop table ta go create table ta id int primary key,col1 int,col2 nvarchar 10 insert ta select ...

python records 庫使用方法

records 庫由大名鼎鼎的 kenneth reitz 開發,他也是 python requests 庫的作者。records 模組的口號是 sql for the human。開發人員基本只需要關注 sql 語句。records 庫基於 sqlalchemy 實現,所以連線字串相同。比如我想基...