Golang插件使用问题:插件版本不兼容的解决方案

Golang插件使用问题:插件版本不兼容的解决方案 我正在尝试使用Go插件库将一个现有的库创建为.so文件。我一直收到这个错误:插件是使用不同版本的包 github.com/gogo/protobuf/proto 构建的。

我尝试让它们都使用这个库的相同版本: 在两个 go.sum 文件中都替换 github.com/gogo/protobuf => v1.3.2

但是,我仍然看到同样的错误。

似乎存在一些间接依赖项,它们没有得到更新。有什么办法可以解决这个问题吗?

1 回复

更多关于Golang插件使用问题:插件版本不兼容的解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个错误通常是由于主程序和插件使用了不同版本的github.com/gogo/protobuf依赖导致的。即使显式指定了相同版本,间接依赖仍可能引入版本冲突。以下是解决方案:

  1. 统一依赖版本: 使用go mod tidygo mod vendor确保依赖一致:
# 在主项目和插件项目中执行
go mod tidy
go mod vendor
  1. 检查间接依赖: 查看实际的依赖关系:
go mod graph | grep gogo/protobuf
  1. 使用replace指令: 在go.mod中强制指定版本:
module your-module

go 1.20

replace github.com/gogo/protobuf => github.com/gogo/protobuf v1.3.2

require (
    github.com/gogo/protobuf v1.3.2
)
  1. 构建时验证: 构建插件时检查版本:
// 构建插件
go build -buildmode=plugin -o plugin.so plugin.go

// 在主程序中加载时检查
plugin.Open("plugin.so")
  1. 完整示例
// main.go
package main

import (
    "plugin"
)

func main() {
    p, err := plugin.Open("plugin.so")
    if err != nil {
        panic(err)
    }
    // 使用插件...
}

// plugin.go
package main

import (
    gogoproto "github.com/gogo/protobuf/proto"
)

func init() {
    // 确保版本一致
    _ = gogoproto.MessageName(nil)
}

确保主程序和插件使用完全相同的Go版本和依赖树。如果问题仍然存在,考虑使用go mod why分析依赖路径。

回到顶部