gcc dynamic load library
Linux下一般都是直接在编译生成时挂接上链接库,运行时,把链接库放到系统环境里就可以了
但是windows出现带来了动态链接的概念,也就兴起了非windows世界的插件的概念的范潮
对应于windows下的
LoadLibrary
GetProcAddress
FreeLibrary
Linux提出了
dlopen
dlsym
dlclose
的相关系统调用
哎,全是抄啊!!!!
一把泪
好了,我想你应该明白怎么回事了吧
下面,带你进入linux动态加载库的世界
这个是由libdl库来运作的噢!!!
//caculate.c
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;
}
//main.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#define LIB_CACULATE_PATH "./libcaculate.so"
typedef int(*CAC_FUNC)(int, int);
int main()
{
void *handle = NULL;
char *error = 0;
CAC_FUNC cac_func = NULL;
handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY);
//handle = dlopen(LIB_CACULATE_PATH, RTLD_NOW);
if (!handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror();
cac_func = (CAC_FUNC)dlsym(handle, "add");
if (cac_func)
{
printf("add: %d\n", cac_func(2, 7));
}
cac_func = (CAC_FUNC)dlsym(handle, "sub");
if (cac_func)
{
printf("sub: %d\n", cac_func(9, 2));
}
cac_func = (CAC_FUNC)dlsym(handle, "mul");
if (cac_func)
{
printf("mul: %d\n", cac_func(3, 2));
}
cac_func = (CAC_FUNC)dlsym(handle, "div");
if (cac_func)
{
printf("div: %d\n", cac_func(8, 2));
}
dlclose(handle);
return 0;
}
//生成库和调用者
gcc -o caculate.o -c caculate.c
gcc -fPIC -shared -o libcaculate.so caculate.o
gcc -o main.o -c main.c
gcc -o main -ldl main.o
//运行与结果
我们的调用者main将要调用libcaculate.so动态库
./main
add: 10
sub: 12
mul: 24
div: 2
Finally:
看这个世界哪里都一样啊!
好了,大家去搞插件去吧!!!
对了,忘了告诉你了,插件已经早就不流行了,哈哈哈
但我觉得历史是不应该被忘记的,记住这个阶段,对于你应该有重大意义的啊
现在,我们的这个世界流行的是Web,“一切皆服务,一切皆应用”
gcc dynamic load library的更多相关文章
- Linux Dynamic Shared Library && LD Linker
目录 . 动态链接的意义 . 地址无关代码: PIC . 延迟版定(PLT Procedure Linkage Table) . 动态链接相关结构 . 动态链接的步骤和实现 . Linux动态链接器实 ...
- How to Use the Dynamic Link Library in C++ Linux (C++调用Delphi写的.so文件)
The Dynamic Link Library (DLL) is stored separately from the target application and shared among dif ...
- DYNAMIC LINK LIBRARY - DLL
https://www.tenouk.com/ModuleBB.html MODULE BB DYNAMIC LINK LIBRARY - DLL Part 1: STORY What do we h ...
- Unreal: Dynamic load map from Pak file
Unreal: Dynamic load map from Pak file 目标:在程序运行时加载自定义 Pak 文件,并打开指定关卡,显示其中的完整 map 内容 Unreal 的 Pak 文件内 ...
- Walkthrough: Create and use your own Dynamic Link Library (C++)
参考网站:https://docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-librar ...
- java.lang.UnsatisfiedLinkError: Unable to load library 'xxx': Native library (win32-x86-64/ID_Fpr.dll)
使用 JNA 调用 dll 库,因为 dll 库是32 位的,而 jvm 是 64位的,所以发生的错误: java.lang.UnsatisfiedLinkError: Unable to load ...
- xvfb启动PyQt4程序报Unable to load library icui18n错误
xvfb启动PyQt4程序报如下错误: Unable to load library icui18n "Cannot load library icui18n: (libicui18n.so ...
- Walkthrough: Creating and Using a Dynamic Link Library (C++)
Original Link: http://msdn.microsoft.com/zh-cn/library/ms235636.aspx Following content is only used ...
- Custom Action : dynamic link library
工具:VS2010, Installshield 2008 实现功能: 创建一个C++ win32 DLL的工程,MSI 工程需要调用这个DLL,并将Basic MSI工程中的两个参数,传递给DLL, ...
随机推荐
- Glusterfs挂载报错解决办法
环境查看 挂载glusterfs时候报错 下载软件(Redhat没有注册无法直接yum安装) https://buildlogs.centos.org/centos/6/storage/x86_64/ ...
- 关于form表单排版的技巧
//此处说明一个对于排版表单的方法将form表单嵌套在table里,因为table是格式化的,所以就不用再手动排版了源码如下 <from action="" method=& ...
- RMQ算法详解
RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法. 当然这个问题用线段树同样能够解决,算法复杂度为:O(N)~O(logN) . ...
- React组件中的key
React组件中的key 一.key的作用 react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key props),而是给reac ...
- [administrative][CentOS][NetworkManager] 万恶的NetworkManager到底怎么用
这好像是第三次不得不去学会NetworkManager的用法,可是它真的很难用.社区里无人不吐槽. 然而,还是要用! 这次从redhat的文档入手,也许可以成功 --! https://access. ...
- 自己写的JdbcUtils小工具-----得到Connection对象
Properties文件中存放键值对------(可看对Properties文件的解析) static代码块是在构造函数之前执行的,而且只执行一次,即类首次加载时. 也就是只加载一次配置文件和加载数据 ...
- 转:Spring AOP中的动态代理
原文链接:Spring AOP中的动态代理 0 前言 1 动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2 S ...
- ini文件读写
//创建对象:iniFile:=TIniFile.Create(strFile); //写入procedure IEAddFavUrl(FURL, Title: string);var fPath: ...
- 分布式任务队列Celery入门与进阶
一.简介 Celery是由Python开发.简单.灵活.可靠的分布式任务队列,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务.Celery侧重于实时操作,但对调度支持也很好,其 ...
- BeanFactoryPostProcessor vs BeanPostProcessor
BeanFactoryPostProcessors affect BeanDefinition objects because they are run right after your config ...