golang中调用c的正确姿势

Python011

golang中调用c的正确姿势,第1张

工程结构如上图所示,我们需要实现的目标是在go文件中调用c文件

foo.c如下:

foo.go如下

foo.h如下:

编译过程如下:

1、先将c文件编译为.o文件,然后生成动态链接库.dylib文件

(1) clang -c foo.c

(2 clang -shared foo.o -o libfoo.dylib

2、在上述的动态链接库生成之后,在foo.go中添加动态链接命令:#cgo LDFLAGS: -L./ -lfoo

需要注意的是

中间不能有空格

Go里面需要显示的引入C模块, 让编译器支持生成动态链接库, 并且在代码中可以使用C语言的数据类型,这个至关重要. Calling Go code from Python code 摘取一个最简单例子

//libadd.go

package main

import "C"

//export add

func add(left, right int) int {

    return left + right

}

func main() {

}

go build -buildmode=c-shared -o libadd.so libadd.go

from ctypes import cdll

lib = cdll.LoadLibrary('./libadd.so')

print("Loaded go generated SO library")

result = lib.add(2, 3)

print(result)