首页 > 编程语言 >C语言调用C++的共享库SO

C语言调用C++的共享库SO

时间:2024-05-08 23:25:17浏览次数:28  
标签:int C++ C语言 so wrapper func test SO

C语言调用C++的共享库SO

今天在项目中,遇到了一个问题,对方提供给我们一个.h的声明文件(使用的是cpp语言),和一个动态库so。但是我们项目中用的是C语言,我们如何来调用so库中的方法呢?我们都知道,C++在设计时,兼容C语言,可以直接调用C语言库中的接口,但是C语言调用C++的接口就会比较困难,比如C++中实现一个类,其中有方法func,那么C语言该怎么调用这个func呢

// test.h
class A {
  static int func(int a, int b);
};

// test.cpp(我们没有这个cpp文件,对方提供给的是so库)
int A::func(int a,int b) {
  return a+b;
}

解决办法就是使用C++语言的extern "C"来告诉编译器,代码用C语言编译方式进行编译

// test_wrapper.h
extern "C" {
  int func(int a, int b);
}

// test_wrapper.cpp
#include "test_wrapper.h"
#include "test.h"
int func(int a, int b) {
  return A::func(a,b);
}

至此,我们做了一个包裹函数,将c++的源文件(so库,我们不知道具体实现),进行一个简单的封装,加上extern "C",使用C语言进行编译。将编译后的结果和原来的so库再次包装成一个新的so库,然后即可链接使用。编译新的so库的命令:

g++ -fPIC -shared libtest.so test_wrapper.cpp -o libtest_wrapper.so  

得到libtest_wrapper.so动态库后
我们就可以将该动态库和test_wrapper.h交给其它C语言用户进行使用

标签:int,C++,C语言,so,wrapper,func,test,SO
From: https://www.cnblogs.com/xyfhsy/p/18181125

相关文章

  • 实时股票数据API接口websocket接入方法
    一、使用websocket的协议提升传输速度实时金融股票API接口对于投资者和交易员来说至关重要。通过使用WebSocket接入方法,可以轻松获取实时金融股票API接口的数据并及时做出决策。WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的轮询请求。这种接入方法具有多......
  • 机器学习包keras skiti-learn tensorflow pytorh yolov6 tensorboad seaborn numpy p
    这些是一些常用的Python库和框架,它们在机器学习、深度学习、数据科学和可视化等领域中被广泛使用。下面是每个库的简要介绍以及一个应用示例:Keras:Keras是一个高级神经网络API,可以运行在TensorFlow、MicrosoftCognitiveToolkit(CNTK)或Theano之上。它提供了简单而灵活......
  • c语言程序设计——实验报告七
    实验项目名称:实验7数组的基本使用实验项目类型:验证性实验日期:2024年4月22日一、实验目的1.熟练掌握数组的定义格式和数组元素的表示方法2.熟悉数组的初始化方法和赋值方法3.掌握字符数组存放字符串的方法和字符串函数的使用4.熟悉数组元素的操作,特别是输入与输出操作5.......
  • https://github.com/long36708/long36708/blob/main/resources/img/grid-snake.svg 请
    对于这个文件,你可以将它放在你的GitHub仓库的"resources"目录下,通常也可以选择"assets"、"images"或者其他类似的名称。如果你还没有这样的目录,你可以按照以下步骤操作:在你的GitHub仓库中创建一个新的目录,可以命名为"resources"、"assets"、"images"或者其他你喜欢......
  • websocket-sharp:.NET平台上的WebSocket客户端与服务器开源库
    1.简介:websocket-sharp提供WebSocket客户端和服务器库,基于C#开发的,并遵循WebSocket协议规范,使得开发人员能够轻松地在.NET应用程序中实现WebSocket通信。https://github.com/sta/websocket-sharpwebsocket-sharp特色功能有:1、简洁易用的API:提供清晰且直观的API接......
  • C++: fatal error: Killed signal terminated program cc1plus
    C++:fatalerror:Killedsignalterminatedprogramcc1plus1.在Linux系统中进行C++编译时,出现如下报错,导致编译中止:C++:fatalerror:Killedsignalterminatedprogramcc1pluscompilationterminated.2.解决方法——swap分区查阅相关信息后,认为是虚拟机内存不足造成......
  • 08. C语言函数
    【函数基础】函数用于将程序代码分类管理,实现不同功能的代码放在不同函数内,一个函数等于一种功能,其它函数可以调用本函数执行。C语言规定所有的指令数据必须定义在函数内部,比如之前介绍的程序执行流程控制语句,另外修改全局变量的操作也是通过指令进行的,所以全局变量只能在函数内......
  • ETL工具中JSON格式的转换方式
    JSON的用处JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其设计初衷是为了提升网络应用中数据的传输效率及简化数据结构的解析过程。自其诞生以来,JSON 已成为Web开发乃至众多软件开发领域中不可或缺的一部分,以其高效、灵活、易读易写的特性,成为了数据交换和存储......
  • SciTech-BigDataAIML-Tensorflow-Keras API-Layers的API
    https://keras.io/api/layers/KeraslayersAPILayersarethebasicbuildingblocksofneuralnetworksinKeras.Alayerconsistsofatensor-intensor-outcomputationfunction(thelayer'scallmethod)andsomestate,heldinTensorFlowvariables(th......
  • Debian 系统 IP 和 DNS 配置, 解决 resolv.conf 文件导致的问题
    IP配置/etc/network/interfacesautoeth0ifaceeth0inetstaticaddressx.x.x.xnetmask255.255.255.0gatewayx.x.x.x#dns-nameservers没有用DNS配置修改文件/etc/systemd/resolved.confDNS=8.8.8.88.8.4.4重启systemd-resolvedsystemctlrestartsystemd-res......