cgo

作者: hehehehe | 来源:发表于2022-02-09 17:47 被阅读0次

https://github.com/chai2010/gopherchina2018-cgo-talk
go->c

package main

/*
#include <stdio.h>

static void SayHello(const char* s) {
    puts(s);
}
*/
import "C"

func main() {
    C.SayHello(C.CString("Hello, World\n"))
    C.puts(C.CString("你好!\n"))
}

编译参数

  • CFLAGS 只包含纯 C 代码(*.c)
  • CPPFLAGS 包含 C/C++ 代码(.c,.cc,.cpp,.cxx)
  • CXXFLAGS 只包含纯 C++ 代码(.cc,.cpp,*.cxx)

链接参数

  • LDFLAGS
package main

//使用#cgo定义库路径

/*
#cgo CFLAGS: -I .
#cgo LDFLAGS: -L . -lhello
#include "hello.h"
*/
import "C"

func main() {
    C.hello()
}
--------------------------------------------------
gcc -c hello.c
ar -cru libhello.a hello.o
--------------------------------------------------
#ifndef HELLO_H
#define HELLO_H
 
void hello(void);
#endif
--------------------------------------------------
#include <stdio.h>
void hello()
{
    printf("hello world\n");
}

c->go

package main

// extern void SayHello(char* s);
import "C"
import "fmt"

func main() {
    C.SayHello(C.CString("Hello, World\n"))
}

//export SayHello
func SayHello(s *C.char) {
    fmt.Print(C.GoString(s))
}

ctypes
生成纯C接口的动态库

// main.go
package main

import "C"
import "fmt"

func main() {}

//export SayHello
func SayHello(name *C.char) {
    fmt.Printf("hello %s!\n", C.GoString(name))
}

--------------------------------------------------

go build -buildmode=c-shared -o say-hello.so main.go

--------------------------------------------------

# hello.py
import ctypes

libso = ctypes.CDLL("./say-hello.so")

SayHello = libso.SayHello
SayHello.argtypes = [ctypes.c_char_p]
SayHello.restype = None

SayHello(ctypes.c_char_p(b"hello"))

基于Py扩展接口(有问题)

//涉及内存的部分必须在C语言定义
//模块的名字是 gopkg
/*
static PyObject* cgo_PyInit_gopkg(void) {
    static PyMethodDef methods[] = {
        {"sum", Py_gopkg_sum, METH_VARARGS, "Add two numbers."},
        {NULL, NULL, 0, NULL},
    };
    static struct PyModuleDef module = {
        PyModuleDef_HEAD_INIT, "gopkg", NULL, -1, methods,
    };
    return PyModule_Create(&module);
}
*/
import "C"

//export PyInit_gopkg
func PyInit_gopkg() *C.PyObject {
    return C.cgo_PyInit_gopkg()
}

//export Py_gopkg_sum
func Py_gopkg_sum(self, args *C.PyObject) *C.PyObject {
    var a, b C.int
    if C.cgo_PyArg_ParseTuple_ii(args, &a, &b) == 0 {
        return nil
    }
    return C.PyLong_FromLong(C.long(a + b))
}

$ go build -buildmode=c-shared -o gopkg.so main.go

相关文章

  • CGO使用

    参考文章: http://golang.org/cmd/cgo is the primary cgo docume...

  • CGO 初步认知和基本数据类型转换

    CGO 是什么? CGO 是 GO 语言里面的一个特性,CGO 属于 GOLANG 的高级用法,主要是通过使用 G...

  • golang win10交叉编译

    写了一个bat文件 set CGO_ENABLED=0 关闭CGO

  • CGO编程

    1)什么是CGO编程?2)CGO语法3)相关资料 一、什么是CGO编程?简单说就是GO语言代码中可以编写C代码和调...

  • cgo

    golang与C有着千丝万缕的联系,go代码中可以调用C代码由于项目需要,新使用的golang语言需要调用C语言写...

  • cgo

    三种方式 在头部嵌入c代码 头部引用.h文件,实际调用动态库,需要指定路径(当前项目使用这种形式) 直接引用文件,...

  • cgo

    cgo cgo是用来在Go语言中调用C语言的工具 Go语言调用C语言 简单C语言函数 在Go语言中需要通过impo...

  • cgo

    转载一篇CGO的文章 Go 与 C 的桥梁:cgo 入门,剖析与实践[https://zhuanlan.zhihu...

  • cgo

    https://github.com/chai2010/gopherchina2018-cgo-talk[http...

  • go 编译时,环境变量CGO_ENABLED的作用

    用法(CGO_ENABLED=1 默认值) CGO_ENABLED=1 go build -o main1 mai...

网友评论

      本文标题:cgo

      本文链接:https://www.haomeiwen.com/subject/retgkrtx.html