看風聽雨之自學程式設計之動態庫
阿新 • • 發佈:2019-02-01
動態庫程式設計
Linux中so檔案為共享庫;windows下dll檔案為共享庫;
在linux中動態庫的呼叫函式是 dlopen(); 在Windows中動態庫的呼叫是LoadLibrary();
Linux:
庫檔案 fun.c
#include <stdio.h> #include <dlfcn.h> int add(int a, int b) //加法 { return a+b; } int sub(int a, int b) //減法 { return a-b; } int mul(int a, int b) //乘法 { return a*b; } int div(int a, int b) //除法 { return a/b; }
gcc -c so.c /
gcc fun.c -fPIC -shared -o libtest.so //檔案生成動態連結庫檔案libtest.so
test.c
#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> #include <unistd.h> #include <string.h> typedef int(* fun_prt)(int ,int); int main() { char file_url[80]; char file_name[30]; void *lib_prt; fun_prt fun_prt= NULL; int a=3; int b=4; getcwd(file_url, sizeof(file_url)); strcpy(file_name ,"/libtest.so"); strcat(file_url , file_name); //拼字串 //printf("current working directory: %s\n", file_url); lib_prt=dlopen(file_url, RTLD_LAZY); if(! lib_prt) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } //清除之前存在的錯誤 dlerror(); fun_prt=dlsym(lib_prt , "add"); if(!fun_prt) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } printf("add: %d\n", (*fun_prt)(a,b)); return 0; }
gcc -o test test.c -ldl //生成測試程式
總結 看了很多教程,在so檔案不放在預設的bin資料夾,或不註冊環境變數的情況下。
總是編譯失敗,或者執行失敗。
後來修改為動態定位相同目錄下指定資料夾的方式,拼接檔名,然後直接傳指標才獲得正確結果!