C++动态链接库实践
参考:https://www.cnblogs.com/Anker/p/3746802.html
gcc -fPIC -shared calc.c -o libcalc.so, 编译得到

在linux上 man dlopen可以得到以下信息:

头文件注释:

实践内容:
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h> //动态链接库路径
#define LIB_CACULATE_PATH "/home/dahui/work/workspace/CStudy/src/libcalc.so" //函数指针
typedef int (*CAC_FUNC)(int, int); int main(void) { printf("!!!Hello World!!!\n"); /* prints !!!Hello World!!! */ void *handle;
char *error;
CAC_FUNC cac_func = NULL; //打开动态链接库
handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
} //清除之前存在的错误
dlerror(); //获取一个函数
*(void **) (&cac_func) = dlsym(handle, "add");
//cac_func = (CAC_FUNC) dlsym(handle, "add");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
printf("add: %d\n", (*cac_func)(, )); cac_func = (CAC_FUNC) dlsym(handle, "sub");
printf("sub: %d\n", cac_func(, )); cac_func = (CAC_FUNC) dlsym(handle, "mul");
printf("mul: %d\n", cac_func(, )); cac_func = (CAC_FUNC) dlsym(handle, "div");
printf("div: %d\n", cac_func(, )); printf("!!!Hello World!!!"); /* prints !!!Hello World!!! */ //关闭动态链接库
dlclose(handle);
//exit(EXIT_SUCCESS); printf("!!!Hello World!!!"); /* prints !!!Hello World!!! */ return EXIT_SUCCESS;
}
输出:

C++动态链接库实践的更多相关文章
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- VC++动态链接库(DLL)编程深入浅出(zz)
VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...
- Java调用C/C++编写的第三方dll动态链接库(zz)
这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...
- 无法定位程序输入点 crtis tailoredApp 于动态链接库MSVCR110.dll
最近 在安装完 PHP开发,集成环境 WAMP 后,运行老是提示 “无法定位程序输入点 crtis tailoredApp 于动态链接库MSVCR110.dll” 网上百度,大多说是重新下载“ ...
- [转贴]实践:C++平台迁移以及如何用C#做C++包装层
终于有个C++ 如何调用C#类库的文章,收藏之 在前面,我们看过OpenTK与MOgre,这二个项目都是C#项目,但是他的实现都是C++.他们简单来说就是一个包装层.常见的包装方式有二种,一 种就是我 ...
- Linux Makefile文件编写详细步骤与实践
Linux Makefile文件编写详细步骤与实践 1.makefile概述 Windows环境下IDE会帮你完成makefile文件的编写,但在UNIX环境下你就必须自己写makefile了,会不会 ...
- VC++动态链接库(DLL)编程深入浅出
1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...
随机推荐
- mybatis的if
<select id="findList" resultType="BndExport"> SELECT <include refid=&qu ...
- QQ空间相册照片批量导出
QQ空间相册照片批量导出 先自己创建一个私人的单独的群,然后创建相册,上传照片来源从空间选图复制 复制完成后打开相册开始骚操作(两种方式) OK
- 2019.9.20使用kali中的metasploi获取windows 的权限
1 kali 基于debin的数字取证系统,上面集成了很多渗透测试工具,其前身是bt5r3(bractrack) 其中Metasploit是一个综合利用工具,极大提高攻击者渗透效率,使用ruby开发的 ...
- 修改Anaconda启动时默认路径
1.找到Anoconda启动快捷方式,入下图: 2.右击点击属性,进入下图: 3.将第三行的 目标(T): ......D:\Anoconda\Scripts\jupyter-notebook-sc ...
- uestc summer training #1
A 一个很好想的dp ll dp[maxn][]; int main() { scanf("%d%d",&n,&k); memset(dp,,sizeof(dp)) ...
- Spring Boot整合拦截器
过滤器和监听器都属于Servlet 的api,还可以使用 Spring 提供的拦截器(HandlerInterceptor)进行改更精细的控制.
- 【鸽】poj3311 Hie with the Pie[状压DP+Floyd]
题解网上一搜一大坨的,不用复述了吧. 只是觉得网上dp方程没多大问题,但是状态的表示含义模糊.不同于正常哈密顿路径求解,状态表示应当改一下. 首先定义一次移动为从一个点经过若干个点到达另一个点,则$f ...
- CSS三角的写法(兼容IE6)
目录 简介 优点 原理 1. 先创建一个div 2. 然后给div设定边框. 3. 给div的四个边框都设置不同的颜色 4. 把宽度和高度都变成0 5. 其余角为透明 6. 兼容IE6浏览器 造成这样 ...
- hive判断数据一个表是否在另一个表中(二)
1.一个表中的数据不存在另一个表中 2.一个表中的数据 存在另一个表中:
- thinkphp5.11 关于数据库连接的配置
config.php <?php// +----------------------------------------------------------------------// | Th ...