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

go 调用C语言函数或者库

1.查看cgo是否开启

go env  | grep CGO_ENABLED
CGO_ENABLED='1'

2. go程序中加入 import "C" 

通过 import “C” 语句启用 CGO 特性后,CGO 会将上一行代码所处注释块的内容视为 C 代码块

单行注释使用//
多行注释使用/*   */

3. go 与C 类型转换

在go安装目录 src\cmd\cgo 中定义

func C.CString(string) *C.char
func C.CBytes([]byte) unsafe.Pointer
func C.GoString(*C.char) string
func C.GoStringN(*C.char, C.int) string
func C.GoBytes(unsafe.Pointer, C.int) []byte

GO语言与C语言的数据类型对应表

3. 直接在go文件中使用函数

package main/*
#include <stdio.h>
int printHello(const char *str){printf("%s\n",str);return 3;
}
*/
import "C"
import ("fmt"
)func main() {fmt.Println("Hello World!")fmt.Println(C.printHello(C.CString("nihao")))
}

4.使用动态库

myprint.c

#include "myprint.h"
#include <stdio.h>
int printHello(const char *str){printf("%s\n",str);return 3;
}

myprint.h

#ifndef __MYPRINTF_H
int printHello(const char *str);
#endif

编译动态库

gcc -fPIC -shared -o libmyprint.so myprint.c

将编译后的动态库拷贝至系统lib路径 ,或者自定义路径下 然后修改/etc/ld.so.conf

执行ldconfig

使用动态库序号包含3行

#cgo CFLAGS: -ImyLibIncPath
#cgo LDFLAGS:  -LmyLibIncPath -lmyprint
#include "myprint.h"

package main/*
#cgo CFLAGS: -I./
#cgo LDFLAGS: -L./ -lmyprint
#include "myprint.h"
*/
import "C"
import ("fmt"
)func main() {fmt.Println("Hello World!")fmt.Println(C.printHello(C.CString("nihao")))
}

5.go与c数据转换可以参考

https://www.cnblogs.com/zhaoyingjie/p/15683384.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 力扣题解(增减字符串匹配)
  • 【笔记】Swin-Transformer 的计算量与Transformer的计算量的对比:前者通过使用新颖的窗口技巧,将后者的高阶项变为低阶,大大降低了计算量
  • Vulkan入门系列9 - Uniform Buffer 资源描述符
  • Eval绕过限制参数限制
  • 数据库交互的艺术:JDBC与数据库连接池的探索之旅
  • vue2+OpenLayers 地图上添加渐变色(6)
  • 负载均衡相关概念介绍(一)
  • java后端都要学那些知识
  • 3D 技术对我们的生活有哪些影响?
  • 【Java】解析方法的调用关系
  • Linux Shell编程--数组
  • Linux服务管理(五)Apache服务优化
  • 贷齐乐hpp+php特性注入
  • Gerrit 使用教程
  • C++ | stack/queue
  • JS 中的深拷贝与浅拷贝
  • .pyc 想到的一些问题
  • @angular/forms 源码解析之双向绑定
  • [deviceone开发]-do_Webview的基本示例
  • Android优雅地处理按钮重复点击
  • iOS小技巧之UIImagePickerController实现头像选择
  • mongodb--安装和初步使用教程
  • Node项目之评分系统(二)- 数据库设计
  • Python爬虫--- 1.3 BS4库的解析器
  • SpiderData 2019年2月16日 DApp数据排行榜
  • spring + angular 实现导出excel
  • 二维平面内的碰撞检测【一】
  • 分布式任务队列Celery
  • 基于 Babel 的 npm 包最小化设置
  • 技术胖1-4季视频复习— (看视频笔记)
  • 看域名解析域名安全对SEO的影响
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 马上搞懂 GeoJSON
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何使用 JavaScript 解析 URL
  • 我这样减少了26.5M Java内存!
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ​ArcGIS Pro 如何批量删除字段
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #include到底该写在哪
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (3)选择元素——(17)练习(Exercises)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (蓝桥杯每日一题)love
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (正则)提取页面里的img标签
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据