1. 程式人生 > >看風聽雨之自學程式設計之動態庫

看風聽雨之自學程式設計之動態庫

動態庫程式設計

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資料夾,或不註冊環境變數的情況下。

        總是編譯失敗,或者執行失敗。

後來修改為動態定位相同目錄下指定資料夾的方式,拼接檔名,然後直接傳指標才獲得正確結果!