cgo

Go Call C

介绍几种golang调用C的方式

Posted by Lengzhao Blog on August 13, 2023

 go调用C语言

简单汇总几种go调用c项目的方式

cgo

cgo是golang默认支持的,能够调用c的最直接的方式

简单例子:

package main

// typedef int (*intFunc) ();
//
// int
// bridge_int_func(intFunc f)
// {
//        return f();
// }
//
// int fortytwo()
// {
//        return 42;
// }
import "C"
import "fmt"

func main() {
    f := C.intFunc(C.fortytwo)
    fmt.Println(int(C.bridge_int_func(f)))
    // Output: 42
}

直接执行go run main.go就可以了。 更多内容请查看官方介绍https://pkg.go.dev/cmd/cgo

// sum.c
int sum(int i,int j){
    return i+j+2;
}
// sum.h
int sum(int i,int j);
package sum

/*

#cgo CFLAGS: -I./
#cgo LDFLAGS: -L./lib -lsum
#include "sum.h"
*/
import "C"

//go:generate gcc -c sum.c -o sum.o
//go:generate ar rcs lib/libsum.a sum.o

func Sum(a, b int) int {
    rst := C.sum(C.int(a), C.int(b))
    return int(rst)
}

swig

  1. 官网
  2. 源码
  3. 说明

SWIG 是一种软件开发工具,它将用 C 和 C++ 编写的程序与各种高级编程语言连接起来。 SWIG 可与不同类型的目标语言一起使用,包括常见的脚本语言,例如 Javascript、Perl、PHP、Python、Tcl、Ruby、C#、D、Go、Java(包括 Android、Lua、OCaml、Octave、Scilab 和 R)。 还支持几种解释和编译的方案实现(Guile、MzScheme/Racket)。 SWIG 最常用于创建高级解释或编译编程环境、用户界面,以及作为 C/C++ 软件测试和原型设计的工具。 SWIG 通常用于解析 C/C++ 接口并生成上述目标语言调用 C/C++ 代码所需的“粘合代码”。 SWIG 还可以以 XML 的形式导出其解析树。SWIG 是免费软件,SWIG 生成的代码与商业和非商业项目兼容。

install

https://github.com/swig/swig/wiki/Getting-Started

  1. download:
  2. install depends: brew install git automake pcre pcre2 boost
  3. build: ./autogen.sh && ./configure && make
  4. install: make install

example

c code:example.c

int sum(int i,int j){
    return i+j+2;
}

example.i

/* example.i */
%module sum
%{
extern int sum(int i,int j);
%}
extern int sum(int i,int j);

do: swig -go example.i

其他实践示例:go通过swig封装、调用c++共享库的技术总结 更多示例:fossies

c-for-go

https://github.com/xlab/c-for-go https://github.com/xlab/c-for-go/wiki/Translator-config-section https://www.cnblogs.com/rongfengliang/p/17406317.html

c4go

将C语言转成golang语言,生成的代码import c4go

https://github.com/Konstantin8105/c4go

c2go

将C语言转成go语言,go语言可以直接使用。

这有2个项目,项目名相同:

  1. https://github.com/elliotchance/c2go
  2. https://github.com/goplus/c2go

c2goasm

https://github.com/minio/c2goasm

AI

现在的AI已经足够强大,比如openai的gpt,可以直接将源码交给gpt,让gpt转成go源码。 gpt是无状态的,每次能够接收的数据有限制。 如果只是小型项目或简单头文件,gpt一次就能够重写完成。 如果是大型项目,则需要对C源代码分开处理,一次只重写少量代码。