Golang动态库调用
在Golang中如何调用C语言编写的动态库(.so/.dll文件)?我尝试用cgo但遇到链接错误,具体是找不到符号。请问正确的调用步骤是什么?需要特别注意哪些编译参数和系统依赖?在Windows和Linux平台下调用方式有什么区别吗?
2 回复
Golang调用动态库可通过cgo实现,需导入C包并使用// #cgo指令指定库路径。示例:
// #cgo LDFLAGS: -L. -lfoo
// #include "foo.h"
import "C"
调用时用C.函数名()即可。注意类型转换和内存管理。
更多关于Golang动态库调用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中调用动态库(如C语言编写的.so、.dll或.dylib文件)可以通过cgo实现。以下是详细步骤和示例:
步骤说明
- 启用cgo:在Go代码中导入
C包,并使用注释指定头文件和链接参数。 - 编写C代码或使用现有动态库:确保动态库及其头文件可用。
- 加载并调用函数:通过
C.函数名直接调用动态库中的函数。
示例:调用C动态库
假设有一个名为libexample.so的动态库,其中包含函数add(int a, int b)。
1. C头文件(example.h)
// example.h
int add(int a, int b);
2. Go代码
package main
/*
#cgo CFLAGS: -I.
#cgo LDFLAGS: -L. -lexample
#include "example.h"
*/
import "C"
import "fmt"
func main() {
a := C.int(10)
b := C.int(20)
result := C.add(a, b) // 调用动态库中的函数
fmt.Printf("Result: %d\n", result)
}
关键点
- 编译指令:
CFLAGS: -I.指定头文件路径。LDFLAGS: -L. -lexample指定库路径(-L.)和库名(-lexample,对应libexample.so)。
- 类型转换:Go的
int需转换为C.int。 - 动态库放置:确保动态库位于系统库路径或
-L指定路径中。
注意事项
- 跨平台兼容性需处理不同系统的库扩展名(如Linux用
.so,Windows用.dll)。 - 复杂数据类型(如结构体、指针)需手动管理内存。
- 通过
//export也可将Go函数暴露给C代码。
通过以上方法,可高效调用动态库功能,扩展Go程序的兼容性和性能。

