c++ so文件_C语言调用Python

c++ so文件_C语言调用Python转自文章《编程基础—–c++与c调用so文件》http://blog.csdn.net/yf210yf/article/details/117129991.制作so文件:libadd_c.soadd.c:intadd(inta,intb){ returna+b;}编译:gcc-shared-fpic-lm-ldl-olibadd_c

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

转自文章《编程基础—–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中指定了 ./ 目录。如果你想放在其他目录,修改该环境变量即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191866.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm配置github_当前系统配置不能运行此程序

    pycharm配置github_当前系统配置不能运行此程序测试开发之代码管理前言一、Pycharm配置git工具1.GitHub新建一个代码仓2.在Pycharm代码中pull下来二、git提交相关规范1.方式一2.方式二三.不规范导致的问题前言团队协作开发自然离不开代码管理工具,使用得当效率高,反之不少麻烦。在这里沉淀对代码管理的理解和运用基于Python自动化测试(UI或接口)基于Pycharm开发工具基于GitHub代码仓库Windows中安装好git工具一、Pycharm配置git工具1.GitHub新建一个代码仓这里是之前去

  • WPFのDecorator 、Adorner和AdornerDecorator

    WPFのDecorator 、Adorner和AdornerDecorator

  • jps 命令_jps只有一个jps进程

    jps 命令_jps只有一个jps进程简介jps(全称:JavaVirtualMachineProcessStatusTool)是java提供的一个用来显示当前所有java进程的pid的命令。unix系统里也有一个ps命令,用来显示当前系统的进程id及其基本情况。配置环境变量jsp命令的位置在JAVA_HOME/bin/jps下,如果使用sudoaptgetinstall、dpkg-i、yuminstall命令进行安装,会自动配置环境变量。如果手动解压,可以编辑~/.bashrc

  • noip2013普及组复赛答案_noip2020初赛

    noip2013普及组复赛答案_noip2020初赛Prob.1转圈游戏找到循环节,然后快速幂。代码:#include<cstdio>#include<cstring>#include<iostream>usingnamespacestd;intpos[1000005],vis[1000000];intn,m,k,x,p,mod;intpow(…

    2022年10月25日
  • 【Linux 内核网络协议栈源码剖析】recvfrom 函数剖析

    【Linux 内核网络协议栈源码剖析】recvfrom 函数剖析继前篇介绍完sendto数据发送函数后,这里介绍数据接收函数recvfrom。一、应用层——recvfrom函数对于这个函数有必要分析一下,先看看这个dup例子。服务器端中调用recvfrom函数,并未指定发送端(客户端)的地址,换句话说这个函数是一个被动函数,有点类似于tcp协议中服务器listen之后阻塞,等待客户端connect。这里则是服务器端recvfrom后,等待客户端

  • linux之文本编辑器

    linux之文本编辑器【目标】管理员在进行系统操作的时候,不可避免地会对文本进行修改,如进行各种服务程序配置文件的改动,使程序对用户提供不同的服务效果。在本章我们向大家介绍Linux上常见的编辑器ed、vi、emacs,同时以vi为例,讲解Linux中的文本编辑,为大家成为优秀的系统管理员打下基础。 【重点内容】Ø       Linux编辑器简介Ø       vi的打开和退出Ø

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号