转载: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动态库就可以了。

编译操作

  1. 先编译mt.c文件,得到libmt.so文件。
  2. 再编译main.c文件
  3. 然后运行,得到一下结果
    7 + 8 = 15
    9 - 3 = 6

注意,在编译main.c文件的时候,需要链接dl,也就是加上-ldl选项。

对于cmake而言,需要加上TARGET_LINK_LIBRARIES(${PROJECT_NAME} dl)即可。

C语言使用dlfcn动态载入.so动态库的更多相关文章

  1. 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)

    动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...

  2. JavaScript学习10:动态载入脚本和样式

    我们在写Web页面的时候,须要引入非常多的JavaScript脚本文件和CSS样式文件,尤其是在站点需求量非常大的时候,脚本的需求量也随之变大,这样一来,站点的性能就会大打折扣.因此就出现了动态载入的 ...

  3. 【转载】动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)

    原文地址:https://www.cnblogs.com/westsoft/p/5936092.html 动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行 ...

  4. win系统动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)

    动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...

  5. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  6. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  7. js中动态载入css js样式

    js中动态载入css样式,方法如下: //<link rel="stylesheet" type="text/css" href="http:/ ...

  8. 深入浅出Android动态载入jar包技术

    在实际项目中.因为某些业务频繁变更而导致频繁升级client的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路.将核心的易于变更的业务封装在jar包里然后通过网络下载下来 ...

  9. Unity 动态载入Panel并实现淡入淡出

    unity版本:4.5 NGUI版本:3.6.5 参考链接:http://tieba.baidu.com/p/3206366700,作者:百度贴吧 水岸上 动态载入NGUI控件,这里用Panel为例说 ...

  10. 实现Android 动态载入APK(Fragment or Activity实现)

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 近期由于项目太大了.导致编译通只是(Android对一个应用中的方法个数貌似有 ...

随机推荐

  1. oracle clob字段信息读取,不限字符长度

    在项目中,经常需要在plsql中查询clob的内容,提供以下两种方法: 第一种,oracle常规函数,限制文本在4000以内 select dbms_lob.substr(sql_text) from ...

  2. [NISACTF 2022]level-up

    [NISACTF 2022]level-up 查看源码,根据这个提示就可以反应出是需要去访问robots.txt这个文件 访问level_2_1s_h3re.php进入第二关 需要post进去arra ...

  3. 深入MySQL索引,这篇千万不能错过

    大家好,我是[码老思],索引是一个数据库绕不开的话题,今天和大家一起聊聊. 1. 索引 索引是对数据库表中一列或多列的值进行排序的一种结构. MySQL索引的建立对于MySQL的高效运行是很重要的,索 ...

  4. css 10-13

    1.背影样式 backgroud-color                   背景颜色 backgroud-color :red backgroud-image                 背 ...

  5. js闭包使用之处

    1.循环绑定 No Use:   var lists = document.getElementsByTagName('li');   for(var i=0;i<lists.length;i& ...

  6. VK Cup 2016 - Round 1 (CF639)

    A. Bear and Displayed Friends Div2 的题,不写. B. Bear and Forgotten Tree 3 这种东西怎么评蓝的? Description 给定 \(n ...

  7. 数据库安装以及Navicat for MySQL 15安装

    1.数据库安装 2.安装数据库遇到的问题,解决方案:1,2 3.Navicat for MySQL安装 4.注册码

  8. ThreadPoolExecutor使用浅谈

    1. 基础介绍 ThreadPoolExecutor是Python标准库concurrent.futures模块中的一个类,用于实现线程池的功能. ThreadPoolExecutor模块相比于thr ...

  9. Python Web UI自动化报错 :ResourceWarning: Enable tracemalloc to get the object allocation traceback

    ResourceWarning资源警告解决方案 原因:在执行线性脚本完毕时,没有及时释放相应资源,导致内存堆积,从而造成内存溢出(如关闭浏览器等操作),此时,Python将会做出提醒: 在百度吸取 网 ...

  10. SQL改写案例3(递归查询开窗案例)

    没错,又是京华的开发老哥,这次找我问个SQL实现逻辑的案例. 我博客的案例基本都是他给我的,真的是又要帮他优化SQL还要教他实现SQL逻辑. 开发老哥写的SQL: SELECT ROW_NUMBER( ...