golang 通过 cgo 调用 C++ 库

思路

将 C++ 库包装成 C 库 -> golang 通过 cgo 调用 C 库

C ++ 相关文件

目录列表

  • include/
    • some.h C++ 库头文件
    • some_wrapper.h <= 用于将 C++ 库包装成 C 库的头文件
  • lib/
    • libsome.a C++ 库
  • src/
    • some_wrapper.cpp <= 用于将 C++ 库包装成 C 库的源码文件

源码示例

some.h
#ifndef SOME_H
#define SOME_H#include <string>
#include <utility>
#include <vector>namespace Some {struct DeviceInfo {std::string id;};std::vector<std::pair<std::string, std::string>> Generate(const DeviceInfo& device);
}#endif  // SOME_H
some_wrapper.h
#ifndef SOME_WRAPPER_H
#define SOME_WRAPPER_H#ifdef __cplusplusextern "C" {#endifstruct some_item {char version[8];char value[32];};struct some_result {struct some_item data[1];int size;};int generate(struct some_result* result, char* id);#ifdef __cplusplus}#endif#endif // SOME_WRAPPER_H
some_wrapper.cpp
#include <string.h>
#include "some.h"
#include "some_wrapper.h"#ifdef __cplusplus
extern "C" {
#endifint generate(struct some_result* result, char* id) {Some::DeviceInfo deviceInfo;deviceInfo.id = id;auto v = Some::Generate(deviceInfo);strcpy(result->data[0].version, v.first.data());strcpy(result->data[0].value, v.second.data());result->size = 1;return 0;}#ifdef __cplusplus
}
#endif

将 C++ 库包装成 C 库

# 编译生成 src/some_wrapper.o 临时目标文件
g++ -c -Iinclude src/some_wrapper.cpp -o src/some_wrapper.o# 生成静态库 lib/libsomewrapper.a
ar -cr lib/libsomewrapper.a src/some_wrapper.o# 删除临时目标文件
rm -rf src/some_wrapper.o

Golang CGO 调用 C 库

package main// #cgo CFLAGS: -I  ${SRCDIR}/include
// #cgo LDFLAGS: -L ${SRCDIR}/lib -lsomewrapper -lsome -lstdc++
// #include <stdlib.h>
// #include "some_wrapper.h"
import "C"
import ("unsafe"
)type DeviceInfo struct {ID string `json:"id"`
}func main() {di := DeviceInfo{ID: "123456",}cID:= C.CString(di.ID)defer C.free(unsafe.Pointer(cID))some := &C.struct_some_result{}C.generate(some, cId)if len(some.data) > 0 {item := some.data[0]version := C.GoStringN(&(item.version[0]), 8)value := C.GoStringN(&(item.value[0]), 32)result := make(map[string]string, someSize)result[version] = valuesomeSize := int(some.size)fmt.Println(result, someSize)}
}
# 编译 go 文件
go install -v# 运行
$GOPATH/bin/demo

参考

  • https://pkg.go.dev/cmd/cgo
  • https://stackoverflow.com/questions/41811563/do-i-have-to-free-structs-created-with-cgo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

113.乐理基础-五线谱-五线谱的调号(二)

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;五线谱的调号&#xff08;一&#xff09;-CSDN博客 调号一共有15个&#xff1a;如下图 上一个内容里写了&#xff0c;C、D、E、F、G、A、B这七个调号&#xff0c;如下图 然后所有调号的五线谱版本&#xff1a; 然后…

博客|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)

个人博客系统目录 目录 基于Springboot的个人博客系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;用户管理 &#xff08;2&#xff09;文章分类管理 &#xff08;3&#xff09;公告信息管理 &#xff08;4&#…

re:从0开始的CSS学习之路 5. 颜色单位

0. 写在前面 没想到在CSS里也要再次了解这些颜色单位&#xff0c;感觉回到了大二的数字图像处理&#xff0c;可惜现在已经大四了&#xff0c;感觉并没有学会什么AI的东西 1. 颜色单位 预定义颜色名&#xff1a;HTML和CSS规定了147种颜色名。例如&#xff1a;red yellow green …

Harbor介绍、整体架构和安装

Harbor介绍、整体架构和安装 文章目录 Harbor介绍、整体架构和安装1.Harbor介绍2.Harbor 整体架构3.安装Harbor3.1 主机初始化3.1.1 设置ip地址3.1.2 配置镜像源3.1.3 关闭防火墙3.1.4 禁用SELinux3.1.5 禁用swap3.1.6 设置时区 3.2 安装docker3.3 安装docker compose3.4 下载H…

kafka 文件存储机制

文章目录 1. 思考四个问题&#xff1a;1.1 topic中partition存储分布&#xff1a;1.2 partiton中文件存储方式&#xff1a;1.3 partiton中segment文件存储结构&#xff1a;1.4 在partition中如何通过offset查找message: 2. kafka日志存储参数配置 Topic是逻辑上的概念&#xff…

彻底弄懂mktemp命令的作用

mktemp 是一个在 Unix 和类 Unix 系统中用于创建临时文件或目录的命令行工具。它属于 GNU coreutils 套件的一部分。mktemp 的主要优点是它能够生成一个唯一的文件名&#xff0c;这有助于避免文件名冲突&#xff0c;并且可以安全地创建临时文件&#xff0c;因为这些文件通常只有…

EMC学习笔记(二十二)降低EMI的PCB设计指南(二)

降低EMI的PCB设计指南&#xff08;二&#xff09; 1.电源和地概述2.电感量3.两层板和四层板4.单层和双层设计中的微控制器接地5.信号返回地6.模拟、数字信号与大功率电源7.模拟电源引脚和模拟参考电源8.四层板电源设计参考注意事项 tips&#xff1a;资料主要来自网络&#xff0…

Unreal Engine 中的插值方法示例

1. 线性插值 线性插值方法 FMath::Lerp。这个方法用于在两个值之间进行线性插值&#xff0c;通过调整插值比例&#xff08;Alpha&#xff09;&#xff0c;我们可以实现平滑的数值过渡。下面是一个简单的例子&#xff1a; float FMath::Lerp(float A, float B, float Alpha); …

外汇天眼:Vistova──假投顾带单获利400%,黑平台一再拖延不出金

在这个物价高涨的时代&#xff0c;愈来愈人意识到投资抗通胀的重要性&#xff0c;但因缺乏相关的专业知识而感到迷茫&#xff0c;甚至因此误信诈骗集团保证获利、稳赚不赔的话术&#xff0c;蒙受极大的金钱损失。 不久前&#xff0c;一位投资人向外汇天眼爆料Vistova这平台&…

tkinter绘制组件(41)——菜单按钮

tkinter绘制组件&#xff08;41&#xff09;——菜单按钮 引言布局函数结构按钮部分菜单显示完整代码函数 效果测试代码最终效果 github项目pip下载结语 引言 TinUI5的新控件&#xff0c;菜单按钮&#xff0c;menubutton。 这是一个与TinUI菜单&#xff08;menubar&#xff0…

DAC调节DCDC输出电压的电路方案分析

BUCK型电源芯片的调压方式分析 1、前题 BUCK型的电源芯片非常多&#xff0c;常用的如LM2576、LM2596等等&#xff0c;这种芯片优点很多&#xff0c;比如功率大、体积小、效率高等。这种芯片一般都可以通过电阻分压的方式设定反馈脚VFB的电压来改变电源芯片的输出电压。但最近…

Ubuntu22.04切换系统cuda版本

由于最近项目要求的cuda版本有差异&#xff0c;而在Ubuntu中可以通过切换cuda来满足需求&#xff0c;现记录如下。 1、按照 Ubuntu22.04与深度学习配置 中的cuda安装章节&#xff0c;将需要的cuda版本下载到本地并进行安装。 2、cuda安装完成后修改bashrc文件内容 sudo gedit …

kmp算法板子及例题

对板子的详细解释见&#xff1a;pecco:kmp 板子 void get_pmt(const string& p) {//求pmt数组for (int i 1, j 0;i < p.size();i) {while (j && p[i] ! p[j])j pmt[j - 1];if (p[i] p[j])j;pmt[i] j;} }void kmp(const string& s, const string&…

2024年-视觉AI检测的面试题目总结

Hello,各位&#xff0c;面试大宝典又来拉; 持续更新&#xff1b;一定要理清自己简历上的项目&#xff0c;因为简历是你给面试官的入口&#xff0c;会根据你的简历问问题&#xff1b;目前leetcode水平169题&#xff1b;持续更新&#xff1b; c八股文和python的八股文最好持续看&…

vscode代码快捷键

1、 log console.log()2、edf export default (first)>{ second } 或者 export default function(params)>{ }可以使用tab键切换修改项 3、ednf export default function first(second) {third}4、! 生成html模板 5、div#app <div id"app"></di…

Java之网络编程

什么是计算机网络 是指将地理位置不同的具有独立功能的计算机设备通过通信连接起来&#xff0c;在网络操作系统、网络管理软件及网络通讯协议的管理与协调下&#xff0c;实现资源共享与信息传递的计算机系统 网络通讯的两个要素 通讯双方的网络地址 1.ip 2.端口号 通过ip端…

DAY14之二叉树理论基础及递归遍历和迭代遍历

理论基础 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 如图所示&#xff1a; 这棵二叉树为满二叉树&#xff0c;也可以说深度为k&#xff0c;有2^k-1个节点的二叉…

CX341A 安装驱动与刷固件

参考 驱动安装1 DPDK编译&#xff1a;支持Mellanox 25Gbps网卡 - 知乎 NVIDIA Mellanox CX网卡固件、驱动系列操作 - 知乎 驱动安装2 Mellanox网卡驱动安装指南 Mellanox OFED_崇尚匀速 追求极致的技术博客_51CTO博客 驱动与固件&#xff1a; 家用万兆网络指南 6 - 比…

动态规划C语言

#include <stdio.h> #include <stdlib.h> //0-1背包问题是一种经典的组合优化问题&#xff0c; //问题描述为&#xff1a;有一个给定容量的背包和一组具有不同价值和重量的物品&#xff0c;如何选择物品放入背包中&#xff0c;以使得背包中物品的总价值最大化&…