go 调用C语言函数或者库

1.查看cgo是否开启

复制代码
go env  | grep CGO_ENABLED
CGO_ENABLED='1'
  1. go程序中加入 import "C"

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

单行注释使用//

多行注释使用/* */

  1. 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语言的数据类型对应表

  1. 直接在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

相关推荐
w***744014 小时前
SpringBoot项目如何导入外部jar包:详细指南
spring boot·后端·jar
r***F26215 小时前
【漏洞复现】CVE-2019-11043(PHP远程代码执行漏洞)信息安全论文_含漏洞复现完整过程_含Linux环境go语言编译环境安装
linux·golang·php
夏天的味道٥16 小时前
@JsonIgnore对Date类型不生效
开发语言·python
tsumikistep16 小时前
【前后端】接口文档与导入
前端·后端·python·硬件架构
小白学大数据17 小时前
Python爬虫伪装策略:如何模拟浏览器正常访问JSP站点
java·开发语言·爬虫·python
码事漫谈17 小时前
为什么C语言拒绝函数重载?非要重载怎么做?
后端
码事漫谈17 小时前
浅谈C++与C语言二进制文件差异(从一次链接错误说起)
后端
SEO_juper17 小时前
别再纠结LLMs.txt了!它背后的真相与最佳使用场景,一文讲透。
开发语言·ai·php·数字营销
g***B73818 小时前
JavaScript在Node.js中的模块系统
开发语言·javascript·node.js
烤麻辣烫18 小时前
黑马程序员大事件后端概览(表现效果升级版)
java·开发语言·学习·spring·intellij-idea