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实现。以下是详细步骤和示例:

步骤说明

  1. 启用cgo:在Go代码中导入C包,并使用注释指定头文件和链接参数。
  2. 编写C代码或使用现有动态库:确保动态库及其头文件可用。
  3. 加载并调用函数:通过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程序的兼容性和性能。

回到顶部