当前位置: 首页 > news >正文

记录 | go与C/C++交互

Go语言是类C的语言,与C语言有着千丝万缕的联系,在Go语言的代码中可以直接调用C语言代码,但不支持直接调用 C++。

Go 调用 C/C++ 的方式:

  • C:直接调用 C API;
  • C++:通过实现一层封装的 C 接口来调用 C++ 接口。

调用C语言

在Go语言的源代码中直接声明C语言代码是比较简单的应用情况,可以直接使用这种方法将C语言代码直接写在Go语言代码的注释中,并在注释之后紧跟 import "C",通过 C.xx 来引用C语言的结构和函数,如下所示:

package main/*
#include <stdio.h>
#include <stdlib.h>typedef struct {int id;
}ctx;ctx *createCtx(int id) {ctx *obj = (ctx *)malloc(sizeof(ctx));obj->id = id;return obj;
}
*/
import "C"
import ("fmt"
)func main() {var ctx *C.ctx = C.createCtx(100)fmt.Printf("id : %d\n", ctx.id)
}

运行结果如下:

go run main.go

id : 100

通过封装实现 C++ 接口的调用

首先我们新建一个 cpp 目录,并将 C++ 的代码放置在 cpp 目录下,C++ 代码需要提前编译成动态库(拷贝到系统库目录可以防止 go 找不到动态库路径),go 程序运行时会去链接。

├── cpp
│   ├── cwrap.cpp
│   ├── cwrap.h
│   ├── test.cpp
│   └── test.h
└── main.go

其中 test.cpp 和 test.h 是 C++ 接口的实现;cwrap.h 和 cwrap.cpp 是封装的 C 接口的实现。

1) test.h

#ifndef __TEST_H__
#define __TEST_H__#include <stdio.h>class Test {public:void call();
};#endif

2) test.cpp

#include "test.h"void Test::call() {printf("call from c++ language\n");
}cwrap.cpp#include "cwrap.h"
#include "test.h"void call() {Test ctx;ctx.call();
}

3) cwrap.h

#ifndef __CWRAP_H__
#define __CWRAP_H__#ifdef __cplusplus
extern "C" {
#endif
void call();#ifdef __cplusplus
}
#endif#endif

4) main.go

package main/*
#cgo CFLAGS: -Icpp#cgo LDFLAGS: -lgotest#include "cwrap.h"
*/
import "C"func main() {C.call()
}

相关文章:

  • ETL数据集成工具DataX、Kettle、ETLCloud特点对比
  • LeetCode9 回文数
  • 关于前后端分离框架的一些疑问
  • Zookeeper客户端命令、JAVA API、监听原理、写数据原理以及案例
  • 二进制部署k8s集群之cni网络插件
  • RF 框架实现企业级 UI 自动化测试
  • golang的map是如何扩容的【重点】
  • 扩展坞的新视角与LDR6023AQ的技术革新
  • 光纤测试中链路插入损耗极限值的计算方法?(及其重要)
  • CAS5.3使用JPA实现动态注册服务
  • ThinkPHP6中使用GatewayWorker
  • AI新纪元:可能的盈利之道
  • QT3作业
  • pikachu靶场-File Inclusion
  • C语言--贪吃蛇
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES6 ...操作符
  • laravel with 查询列表限制条数
  • REST架构的思考
  • Windows Containers 大冒险: 容器网络
  • 欢迎参加第二届中国游戏开发者大会
  • 如何编写一个可升级的智能合约
  • 学习ES6 变量的解构赋值
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 如何在招聘中考核.NET架构师
  • #ifdef 的技巧用法
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (07)Hive——窗口函数详解
  • (第二周)效能测试
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (论文阅读11/100)Fast R-CNN
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)详解PHP处理密码的几种方式
  • .Net 6.0 处理跨域的方式
  • .net wcf memory gates checking failed
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .net实现客户区延伸至至非客户区
  • ??eclipse的安装配置问题!??
  • [BT]BUUCTF刷题第4天(3.22)
  • [DP 训练] Longest Run on a Snowboard, UVa 10285
  • [Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [javaSE] 看知乎学习工厂模式
  • [jquery]this触发自身click事件,当前控件向上滑出