Linux C动态链接库实现一个插件例子
实现一个简单的计算动态链接库;升级动态链接库后,在不重新编译主程序的情况下,直接生效。
lib库:
#cat math.c
#include <stdio.h>
int add(int x, int y)
{
return (x + y);
}
int sub(int x, int y)
{
return (x - y);
}
int mul(int x, int y)
{
return (x * y);
}
int div(int x, int y)
{
return (x/y);
}
生成动态链接库
#gcc -shared -fPIC -o libmath.so math.c
主程序:
#cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
typedef int (*cac_func)(int, int);
int main(void)
{
void *handle;
char *error;
cac_func fp=NULL;
handle = dlopen("./libmath.so", RTLD_LAZY);
if (!handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror();
fp = dlsym(handle, "add");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
printf("add:%d\n", fp(1,1));
return 0;
}
#gcc -o main.out main.c
/tmp/ccTdLhjj.o: In function `main':
main.c:(.text+0x1b): undefined reference to `dlopen'
main.c:(.text+0x2b): undefined reference to `dlerror'
main.c:(.text+0x56): undefined reference to `dlerror'
main.c:(.text+0x67): undefined reference to `dlsym'
main.c:(.text+0x70): undefined reference to `dlerror'
collect2: error: ld returned 1 exit status
需要使用 指定使用动态链接库: dl
#gcc -o main.out -ldl main.c
运行:
#./main.out
add:2
修改库:
#cat math.c
#include <stdio.h>
int add(int x, int y)
{
return (x + y + 100);
}
重新编译库:
#gcc -shared -fPIC -o libmath.so math.c
运行:
#./main.out
add:102
Linux C动态链接库实现一个插件例子的更多相关文章
- Linux下libaio的一个简单例子
转载:http://www.cnblogs.com/aLittleBitCool/archive/2011/10/18/2216646.html 异步io,很好玩的一个东西,从接口来看,封装的比较厉害 ...
- Linux打补丁的一个简单例子
前言 在做开发的过程中难免需要给内核及下载的一些源码打补丁或者说是升级,所以我们学习在Linux下使用diff制作补丁以及如何使用patch打补丁显得尤为重要. diff与patch命令介绍 ...
- linux下动态链接库解决方案(二)
以前写过一个关于linux下用c++写动态链接库无法通过的解决方案,今天看到<linux C程序设计-王者归来>这本书,书中有个更容易的解决方案,特此记录下来 书中使用的是c语言,我改用c ...
- linux中动态链接库的创建与使用
LINUX系统中动态链接库的创建与使用 http://www.cnblogs.com/ardar/articles/357321.html 正常C源文件编写,编译时-shared即可得到SO, gcc ...
- Linux 关于动态链接库以及静态链接库的一些概念
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀.例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhe ...
- 理解 Linux shell 中的一个方言:2>&1
理解 Linux shell 中的一个方言:2>&1 2016-11-14 杜亦舒 前言 在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 如 ...
- [试玩] FMXLinux (Firemonkey for Linux) Linux 桌面开发(第三方插件)
FMXLinux 是一个可以用来开发 Linux 桌面软件的第三方插件,它需要配合 Delphi 10.2 Toyko 官网:http://www.fmxlinux.com/ 使用方法:开启 FMX ...
- js写一个插件
//;分号开头,用于防止代码压缩合并时与其它代码混在一起造成语法错误 //而事实证明,uglify压缩工具会将无意义的前置分号去掉,我只是习惯了这么写 //(function(){})();立即执行函 ...
- jquery.SuperSlide.js只需要调用一个插件就能实现网页大部分特效--推荐
很棒的一个插件,http://www.superslide2.com/
随机推荐
- VMware虚拟机安装WinXP出现错误output error file to the following location A:\GHOSTERR.TXT
我们安装Ghost版WinXP系统的时候,可能会出现一个如下图这样的错误:output error file to the following location A:\GHOSTERR.TXT. 出现 ...
- Java-Runoob-高级教程-实例-字符串:07. Java 实例 - 字符串分割
ylbtech-Java-Runoob-高级教程-实例-字符串:07. Java 实例 - 字符串分割 1.返回顶部 1. Java 实例 - 字符串分割 Java 实例 以下实例使用了 split ...
- 洛谷 P1251 餐巾计划问题【最小费用最大流】
建图细节比较多,对于每个点i,拆成i和i',i表示用的餐巾,i'表示脏餐巾,连接: (s,i,r[i],p)表示在这一天买新餐巾 (i,t,r[i],0)表示这一天用了r[i]的餐巾 (s,i+n,r ...
- thinkphp5.0常遇到的错误
call a member xxxx on null 1.一般是没有继承controller: 2.对象和数组使用错误.
- 【牛客-14602】xinjun与阴阳师(01背包)
xinjun与阴阳师 题目描述 xinjun是各类手游的狂热粉丝,因随手一氪.一氪上千而威震工大,现在他迷上了阴阳师.xinjun玩手游有一个习惯,就是经过层层计算制定出一套方案来使操作利益最大化(因 ...
- Unix\Linux | 总结笔记 | 邮件发送
实验:在本地实现不同用户收发邮件 #root发送邮件 #stu 收邮件 #stu 查看邮件 并回复邮件 #root 查看stu回复的邮件
- head first python /chapter7 web(python 3 转 python 2.7)
前言 书中使用的是python3,我这里使用的是python2.7 Web 的目录树 webapp/ ├── cgi-bin │ ├── athletelist.py │ ├── athletemod ...
- BZOJ4571
BZOJ4571 Description Transmission Gate 给定n个数, m次询问, 每次询问[l,r]范围内的数加上x后异或b的最大值, x, b给出. \[n,m <= 2 ...
- 洛谷 P3804 【模板】后缀自动机
来一份模板 #include<cstdio> #include<algorithm> #include<cstring> #include<queue> ...
- DP UVALive 6506 Padovan Sequence
题目传送门 /* 题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大 DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + ...