实例: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来确定库的名字

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

  1. linux编写日志接口so,linux下动态链接问题(.so文件的编写与调用) .

    .o 就相当于windows里的obj文件 .a 是好多个.o合在一起,用于静态连接 .so 是shared object,用于动态连接的,和dll差不多 sotest.c #include int ...

  2. mysql实现程序的动态链接_程序的链接和装入及Linux下动态链接的实现

    链接器和装入器的基本工作原理 一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两个步骤.从程序员的角度来看,引入这两个步骤带来的好处就是可以直接在程序中使用printf和errno这种有意义 ...

  3. linux取消头文件链接,【原创】Linux下编译链接中常见问题总结

    前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. ...

  4. 删除 linux的ln文件夹,linux下添加链接与删除链接(ln命令的用法)

    添加链接使用ln命令 用法: #ln --help 用法:ln [选项]... 目标 [链接名] 或:ln [选项]... 目标... 目录 或:ln [选项]... --target-directo ...

  5. 运维日记010 - Linux下的链接文件

    运维日记010 - Linux下的链接文件 几个基本概念 Linux下的链接文件可以分为硬链接(hard link)与软链接(soft link).要理解它们,必须先要理解几个基本概念. inode ...

  6. Linux下动态库的创建与更新

    Linux下动态库(libname.x.y.z)的创建与更新 由于主程序和它依赖的共享库是由不同的开发者开发的.共享库的开发者会不停地更新共享库的版本,以修正bug,增加功能或改进性能.版本多了之后, ...

  7. linux如何确定共享库路径,摘录Linux下动态共享库加载时的搜索路径详解

    对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似"error while loading shared libraries"这样的错误,这是典型的因为需要的动态库不在动态链接器 ...

  8. Linux下动态库和静态库制作与调用

    Linux下动态库和静态库制作与调用 1.动态库和静态库简介   静态库是指在应用中,有一些公共代码需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所 ...

  9. linux里c库和gnu c库,Linux下的C的库文件和头文件有什么区别-

    Linux下的C的库文件和头文件有什么区别- (2012-04-10 01:16:57) 标签: linux 杂谈 Linux下的C的库文件和头文件有什么区别?刚刚接触 这里有点没搞清楚 如果按我的理 ...

最新文章

  1. express支持i18n国际化
  2. 我开发了一个对.NET程序进行瘦身的工具
  3. android德州扑克计算器,学界 | 一台笔记本打败超算:CMU冷扑大师团队提出全新德扑AI Modicum...
  4. 影响 Chrome、Edge 等浏览器的 V8 引擎0day
  5. 解决datepicker设置选中日期setDate不生效问题
  6. Ubuntu修改su和sudo密码
  7. IE iframe不刷新的问题之完美解决
  8. 如何用阿里云服务器建立一个wordpress网站
  9. [360优化]让360安全卫士比火绒还好用 #调教360
  10. es7.3.2中文+拼音分词 排除同音字
  11. Nginx-代理服务器
  12. unity build-in管线中的PBR材质Shader分析研究
  13. python 运行画图时,报错:“RuntimeError: Invalid DISPLAY variable“
  14. Modelica生态工具开发利器——同元软控MWorks.SDK 2.0
  15. 商业银行管理(ROSE) 思维导图
  16. WebKit、Safari以及SafariViewController
  17. 画活动图教程_如何画一只漫画风的手,看着自己的俩只手,带你从零开始入门手绘——008...
  18. C语言ATM机模拟操作程序
  19. 数据分析——数据处理
  20. 特斯拉称正调查上海停车场特斯拉车辆自燃事故

热门文章

  1. 设计非常优秀的软件界面
  2. mysql复制架构迁移到pxc_mysql复制(高可用架构方案的基础)
  3. lolfps高但画面不流畅_你吃鸡卡吗,超详细和平精英画面设置教程,解决卡顿,主播都在用...
  4. php cms word导入,phpcms V9文章编辑器不能按word文档复制过来的段头缩进显示
  5. c++全局类对象_史上最全 Python 面向对象编程
  6. java自己写一个上下文_5.自己动手写Java Web框架-上下文
  7. datagrid出现相同两组数据_stata 数据操作基础知识:以一篇论文数据操作为例
  8. C语言学习笔记--动态库和静态库的使用
  9. c++ const 类型检查
  10. 分计算iv值_S71200PLC模拟量编程方法与计算原理