日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下动态链接问题(so文件的编写与调用)

發布時間:2025/3/21 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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來確定庫的名字

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的linux下动态链接问题(so文件的编写与调用)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。