转自文章《编程基础-----c++与c调用so文件》http://blog.csdn.net/yf210yf/article/details/11712999

1.制作so文件:libadd_c.so

add.c:

int add(int a, int b)
{return a + b;
}

编译:

gcc -shared -fpic -lm -ldl -o libadd_c.so add.c

2.编写测试函数

test.cpp

#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{int a = 0;void *handle = dlopen("./libadd_c.so", RTLD_LAZY);if(!handle){printf("open lib error\n");cout<<dlerror()<<endl;return -1;}typedef int (*add_t)(int a, int b);add_t add = (add_t) dlsym(handle, "add");if(!add){cout<<dlerror()<<endl;dlclose(handle);return -1;}a = add(3, 4);printf("a = %d\n",a);dlclose(handle);return 0;
}

编译:

g++ test.cpp -ldl -o test

3.运行

./test

参考:

介绍一下上面用到的接口函数

1) dlopen

函数原型:void *dlopen(const char *libname,int flag);

功能描述:dlopen必须在dlerror,dlsym和dlclose之前调用,表示要将库装载到内存,准备使用。如果要装载的库依赖于其它库,必须首先装载依赖库。如果dlopen操作失败,返回NULL值;如果库已经被装载过,则dlopen会返回同样的句柄。

参数中的libname一般是库的全路径,这样dlopen会直接装载该文件;如果只是指定了库名称,在dlopen会按照下面的机制去搜寻:

a.根据环境变量LD_LIBRARY_PATH查找

b.根据/etc/ld.so.cache查找

c.查找依次在/lib和/usr/lib目录查找。

flag参数表示处理未定义函数的方式,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暂时不去处理未定义函数,先把库装载到内存,等用到没定义的函数再说;RTLD_NOW表示马上检查是否存在未定义的函数,若存在,则dlopen以失败告终。

2) dlerror

函数原型:char *dlerror(void);

功能描述:dlerror可以获得最近一次dlopen,dlsym或dlclose操作的错误信息,返回NULL表示无错误。dlerror在返回错误信息的同时,也会清除错误信息。

3) dlsym

函数原型:void *dlsym(void *handle,const char *symbol);

功能描述:在dlopen之后,库被装载到内存。dlsym可以获得指定函数(symbol)在内存中的位置(指针)。如果找不到指定函数,则dlsym会返回NULL值。但判断函数是否存在最好的方法是使用dlerror函数,

4) dlclose

函数原型:int dlclose(void *);

功能描述:将已经装载的库句柄减一,如果句柄减至零,则该库会被卸载。如果存在析构函数,则在dlclose之后,析构函数会被调用。

好了,现在来编译打包,命令如下:

$ g++ -shared -fPIC -o libhello.so hello.cpp
$ g++ main.cpp -ldl

在上面dlopen函数中,看到我们传的第一个参数并没有指定路径,只给出了库的名称。那是因为已经在环境变量LD_LIBRARY_PATH中指定了 ./ 目录。如果你想放在其他目录,修改该环境变量即可。

C++与C调用so文件相关推荐

  1. thinkphp 调用php文件上传,ThinkPHP实现带验证码的文件上传功能实例

    本文实例讲述了ThinkPHP实现带验证码的文件上传功能.分享给大家供大家参考.具体实现方法如下: ThinkPHP上传文件非常的简单我们只要调用一个文件上传类UploadFile就可以快速的实现上传 ...

  2. python调用js库中的函数_Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

  3. Hadoop集群上使用JNI,调用资源文件

    hadoop是基于java的数据计算平台,引入第三方库,例如C语言实现的开发包将会大大增强数据分析的效率和能力. 通常在是用一些工具的时候都要用到一些配置文件.资源文件等.接下来,借一个例子来说明ha ...

  4. 关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序。

    关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. 参考文章: (1)关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. (2)https://www. ...

  5. docker-compose up volumes 调用外部文件,权限问题 cannot open directory xxxxx .: Permission denied

    今天在测试环境上用docker安装测试环境,在nginx 里面,调用外部文件,显示cant open xxx.conf问题. 解决问题思路: 1. 看到pressmission denied 就猜到最 ...

  6. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

  7. php python-浅谈php调用python文件

    关于PHP调用Python数据传输问题 这是以前大学时做项目出现的问题,现在把它挪上来,希望给遇到问题的未来大佬给出一些小的思路,请大佬们不要大意的帮我改正,如果出现问题或者有更好的解决方法,希望大家 ...

  8. python py生成及调用pyc文件

    本文仅供学习交流使用,如侵立删!demo下载见文末 python py文件中调用pyc文件 1.生成pyc文件 # 目录下所有py文件生成pyc import compileall compileal ...

  9. Nginx+lua 实现调用.so文件方法

    本文给大家分享的是Nginx结合lua 实现调用.so动态链接库文件的方法和示例,有需要的小伙伴可以参考下 最近在和智能硬件部门一起,做一个室内定位的服务,该服务根据手机端传过来的beacon设备列表 ...

  10. Python命令行解析:IDE内点击Run运行代码直接得出结果、基于TF flags(或argparse、sys.argv)在Dos内命令行(一条命令)调用代码文件得出结果

    Python命令行解析:IDE内点击Run运行代码直接得出结果.基于TF flags(或argparse.sys.argv)在Dos内命令行(一条命令)调用代码文件得出结果 目录 命令行解析 T1.采 ...

最新文章

  1. JMeter学习(十)内存溢出解决方法
  2. STM32 之十 供电系统及内部参照电压(VREFINT)使用及改善ADC参考电压
  3. GoLang学习笔记——data_type
  4. HTML期末作业-香水网站
  5. N1刷音乐服务器系统,NAS也要发烧-Melco N1A音乐服务器
  6. 网易考拉的服务架构如何从单体应用走向微服务化? | 技术头条
  7. 分享个强大的抓包工具
  8. 服务器打完补丁无法进入系统,win7系统电脑更新补丁后无法进入系统怎么办
  9. [Algorithm]Bubble_冒泡算法代码实现
  10. 认识电信产品生命周期管理PLM及其PLM服务
  11. 为什么有的程序员干不到30岁就转行了?
  12. 集合addAll方法使用存在的问题。
  13. Mac上使用Emacs
  14. 2023湖北大学考研分析
  15. 图像处理专业术语中英文对照
  16. linux服务器看门狗服务,服务器watchdog看门狗的理解
  17. 2021年资源、环境与绿色经济国际学术会议 (CREGE 2021)
  18. 批量自动生成Word程序
  19. 数字化时代需要迎接新技术
  20. 食住玩3dmax|室内设计师如何用CORONA设置成品效果图出大图的渲染参数?

热门文章

  1. MFC中窗口类、句柄的获取
  2. 数据仓库和数据挖掘复习
  3. 中兴网络设备交换机路由器查看所有端口光功率命令
  4. 发电厂及电力系统类毕业论文文献都有哪些?
  5. web渗透中bypass防护系统
  6. H.265 SAO技术
  7. 计算机术语 gc 是什么意思,gc是什么意思(女生网络用语gc的含义)
  8. 高等数学(第七版)同济大学 习题4-5 个人解答
  9. 2022:中国存储的生死时速
  10. QQ群技术:0成本创建2000人QQ群技巧