使用CGO从C源代码构建包含C函数的Golang共享库
使用CGO从C源代码构建包含C函数的Golang共享库 大家好…
我想构建一个Go的C共享库,其中包含来自C源代码的C函数…cgo能实现这个功能吗?
谢谢
3 回复
是的,使用CGO可以从C源代码构建包含C函数的Golang共享库。以下是实现步骤和示例代码:
首先,创建C头文件 clib.h:
#ifndef CLIB_H
#define CLIB_H
int add(int a, int b);
void print_message(const char* msg);
#endif
创建对应的C源文件 clib.c:
#include <stdio.h>
#include "clib.h"
int add(int a, int b) {
return a + b;
}
void print_message(const char* msg) {
printf("Message: %s\n", msg);
}
创建Go包装文件 wrapper.go:
package main
/*
#cgo CFLAGS: -I.
#cgo LDFLAGS: -L. -lclib
#include "clib.h"
*/
import "C"
import "unsafe"
//export Add
func Add(a, b int) int {
return int(C.add(C.int(a), C.int(b)))
}
//export PrintMessage
func PrintMessage(msg string) {
cmsg := C.CString(msg)
defer C.free(unsafe.Pointer(cmsg))
C.print_message(cmsg)
}
func main() {}
构建共享库:
# 首先构建C静态库
gcc -c clib.c -o clib.o
ar rcs libclib.a clib.o
# 然后构建Go共享库
go build -buildmode=c-shared -o libgoshared.so wrapper.go
使用示例(C语言调用):
#include <stdio.h>
#include "libgoshared.h"
int main() {
int result = Add(5, 3);
printf("5 + 3 = %d\n", result);
PrintMessage("Hello from C!");
return 0;
}
编译并运行C程序:
gcc -o test test.c -L. -lgoshared
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./test
关键点说明:
- Go文件必须包含
//export指令导出函数 - 使用
-buildmode=c-shared标志构建共享库 - CGO会自动生成头文件
libgoshared.h - 需要正确处理C字符串的内存管理
这样就能创建包含C函数的Golang共享库,供其他语言调用。


