linux下動態鏈接問題(.so文件的編寫與調用)

 實例:deposit.c save.c dig.h dy.c 這是一個及其簡陋的銀行界面(姑且這麼說吧)

1.(deposit.c文件,取款)
#include "dig.h"

void deposit(){
 printf("you deposit 5000$ /n"); 
}
2.(save.c文件,存款)
#include "dig.h"

void save(){
 printf("you saved 1000$ /n"); 
}
3.(dig.h文件)
#ifndef _DIG_H
#define _DIG_H

#ifdef SHARED
void (*save)();
#else
void save();
#endif

#ifdef SHARED
void (*deposit)();
#else
void deposit();
#endif

#endif

4.(dy.c主函數調用兩項功能)
#include <stdio.h>
#include <dlfcn.h>
#define SOFILE "./my.so"
#define SHARED
#include "dig.h"

main(){
 void *dp;
 char *error;
 void (*func)();
 while(1){
  /*以下爲調用.so文件,用到了函數dlopen8/  
  dp =dlopen(SOFILE,RTLD_LAZY);//打開.so文件,RTLD_LAZY爲參數
  if(dp==NULL){
   fputs(dlerror(),stderr);
   exit(1); 
  }
  showGUI();
  char s[10];
  scanf("%s",&s); 
  func = dlsym(dp,s);//把輸入的字符串s與.so文件中的文件名匹配,看是否能找到此函數
  error = dlerror();
  if(error){
   fputs(error,stderr);
   exit(1); 
  }
  (*func)();//找到了此函數如輸入的是 save 則在此調用save函數
  continue;
 }
 dlclose(dp);
 exit(0);
}
int showGUI(){
 FILE *login;
 char c;
 login = fopen("login.txt","r");
 if(!login){
  printf("file err:login/n");
  return; 
 }
 while(1){
  c = fgetc(login);
  if(c == EOF){
   break; 
  }
  printf("%c",c); 
 }
 fclose(login);
 return 0;
}

編譯過程:
1.編譯得到my.so文件
gcc save.c deposit.c -fPIC -shared -o my.so

2.編譯生成執行文件 dy
gcc dy.c -L. -lmy -o dy

詳細說明:
-fPIC:表示編譯爲位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的,所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正的代碼段共享的目的
-L. :表示要連接的庫在當前的目錄中
-lmy:編譯器查找動態鏈接庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名字

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章