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, ...
随机推荐
- HDU 2072 - 单词数 - [(有点小坑的)字典树模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072 Problem Descriptionlily的好朋友xiaoou333最近很空,他想了一件没有 ...
- day11:装饰器
1,引子,计算函数的运行时间: import time def func(): time.sleep(0.01) # 为了计算运行时间差的时候有值 print("func") de ...
- 单调性 [1 + 1 / (n)]^n
def f(n): n += 0.0 s = 1 + 1 / (n) r = pow(s, n) print(n, ',', r) return r l = []for i in range(1, 1 ...
- java发送get,post请求
方法里面有注释:参照csdn里面的,项目用时自己改 package com.bst.express; import java.io.BufferedReader; import java.io.Dat ...
- java mvc spring boot
spring mvchttp://www.cnblogs.com/wcf6676/p/5333352.html 利用mybatis-generator自动生成代码http://www.cnblogs. ...
- [grub2] grub2修改启动顺序
https://wiki.centos.org/HowTos/Grub2#head-535f476a61e62f24bc150c73f7e0816f85345f46 1, 查看所有的entry [ro ...
- c#中base64编码解码
//编码: byte[] bytes = Encoding.Default.GetBytes("要转换的字符"); string str = Convert.ToBase64Str ...
- c语言数组应用
#include <stdio.h> #define SIZE 5 int main(void) { int sum[3]={0},sum2[SIZE]={0},i,sum1=0; dou ...
- IAM:亚马逊访问权限控制
IAM的策略.用户->服务器(仓库.业务体) IAM:亚马逊访问权限控制(AWS Identity and Access Management )IAM使您能够安全地控制用户对 AWS 服务和资 ...
- 帝国cms用户密码忘记怎么修改
帝国CMS7.2忘记后台密码怎么找回呢?有时候经常会忘记用户密码,我们可以通过修改数据库的值来初始化密码,下面就和ytkah一起来操作吧 1:进入phpmyadmin 2:找到 phome_enews ...