C语言使用dlfcn动态载入.so动态库
转载:https://mp.weixin.qq.com/s?__biz=Mzk0NDYzNTI1Ng==&mid=2247483722&idx=1&sn=09a9458b0126248ac2cfb6e17eb36af9&chksm=c320ed5df457644b50d17905c31847dcabf0e64e496a496a58c7dfc2deb1a943ca17d7b963ec#rd
C语言使用dlfcn动态载入.so动态库
使用dlfcn.h通过指定.so文件的位置,动态载入.so文件。在编译的时候,不需要提前链接.so文件,也不需要头文件。
代码
主程序(main.c)代码如下
#include <stdio.h>
// 首先导入了dlfcn.h头文件
#include <dlfcn.h>
int main() {
void* handle = dlopen("../lib/build/libmt.so", RTLD_LAZY); // dlopen的第一个参数制定.so文件位置,可以使用绝对路径。第二个参数可以自行查阅资料
int (*add)(int a, int b), (*sub)(int a, int b); // 定义一个函数指针
/*根据动态链接库操作句柄与符号,返回符号对应的地址*/
add = dlsym(handle, "add"); // 获取函数
sub = dlsym(handle, "sub");
int x1 = add(7, 8), x2 = sub(9,3); // 执行函数
printf("7 + 8 = %d\n", x1);
printf("9 - 3 = %d\n", x2);
dlclose(handle);
return 0;
}
mt.c文件的内容如下
int add(int a, int b){
return a + b;
}
int sub(int a, int b){
return a - b;
}
然后将其编译成libmt.so动态库就可以了。
编译操作
- 先编译
mt.c文件,得到libmt.so文件。 - 再编译
main.c文件 - 然后运行,得到一下结果
7 + 8 = 15
9 - 3 = 6
注意,在编译main.c文件的时候,需要链接dl,也就是加上-ldl选项。
对于cmake而言,需要加上TARGET_LINK_LIBRARIES(${PROJECT_NAME} dl)即可。
C语言使用dlfcn动态载入.so动态库的更多相关文章
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...
- JavaScript学习10:动态载入脚本和样式
我们在写Web页面的时候,须要引入非常多的JavaScript脚本文件和CSS样式文件,尤其是在站点需求量非常大的时候,脚本的需求量也随之变大,这样一来,站点的性能就会大打折扣.因此就出现了动态载入的 ...
- 【转载】动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
原文地址:https://www.cnblogs.com/westsoft/p/5936092.html 动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行 ...
- win系统动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- js中动态载入css js样式
js中动态载入css样式,方法如下: //<link rel="stylesheet" type="text/css" href="http:/ ...
- 深入浅出Android动态载入jar包技术
在实际项目中.因为某些业务频繁变更而导致频繁升级client的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路.将核心的易于变更的业务封装在jar包里然后通过网络下载下来 ...
- Unity 动态载入Panel并实现淡入淡出
unity版本:4.5 NGUI版本:3.6.5 参考链接:http://tieba.baidu.com/p/3206366700,作者:百度贴吧 水岸上 动态载入NGUI控件,这里用Panel为例说 ...
- 实现Android 动态载入APK(Fragment or Activity实现)
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 近期由于项目太大了.导致编译通只是(Android对一个应用中的方法个数貌似有 ...
随机推荐
- oracle clob字段信息读取,不限字符长度
在项目中,经常需要在plsql中查询clob的内容,提供以下两种方法: 第一种,oracle常规函数,限制文本在4000以内 select dbms_lob.substr(sql_text) from ...
- [NISACTF 2022]level-up
[NISACTF 2022]level-up 查看源码,根据这个提示就可以反应出是需要去访问robots.txt这个文件 访问level_2_1s_h3re.php进入第二关 需要post进去arra ...
- 深入MySQL索引,这篇千万不能错过
大家好,我是[码老思],索引是一个数据库绕不开的话题,今天和大家一起聊聊. 1. 索引 索引是对数据库表中一列或多列的值进行排序的一种结构. MySQL索引的建立对于MySQL的高效运行是很重要的,索 ...
- css 10-13
1.背影样式 backgroud-color 背景颜色 backgroud-color :red backgroud-image 背 ...
- js闭包使用之处
1.循环绑定 No Use: var lists = document.getElementsByTagName('li'); for(var i=0;i<lists.length;i& ...
- VK Cup 2016 - Round 1 (CF639)
A. Bear and Displayed Friends Div2 的题,不写. B. Bear and Forgotten Tree 3 这种东西怎么评蓝的? Description 给定 \(n ...
- 数据库安装以及Navicat for MySQL 15安装
1.数据库安装 2.安装数据库遇到的问题,解决方案:1,2 3.Navicat for MySQL安装 4.注册码
- ThreadPoolExecutor使用浅谈
1. 基础介绍 ThreadPoolExecutor是Python标准库concurrent.futures模块中的一个类,用于实现线程池的功能. ThreadPoolExecutor模块相比于thr ...
- Python Web UI自动化报错 :ResourceWarning: Enable tracemalloc to get the object allocation traceback
ResourceWarning资源警告解决方案 原因:在执行线性脚本完毕时,没有及时释放相应资源,导致内存堆积,从而造成内存溢出(如关闭浏览器等操作),此时,Python将会做出提醒: 在百度吸取 网 ...
- SQL改写案例3(递归查询开窗案例)
没错,又是京华的开发老哥,这次找我问个SQL实现逻辑的案例. 我博客的案例基本都是他给我的,真的是又要帮他优化SQL还要教他实现SQL逻辑. 开发老哥写的SQL: SELECT ROW_NUMBER( ...