登录
首页 >  Golang >  Go问答

加载已完成的插件

来源:stackoverflow

时间:2024-02-12 20:21:24 297浏览 收藏

大家好,我们又见面了啊~本文《加载已完成的插件》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

当我第二次加载插件时,我遇到了这个奇怪的问题,它抛出错误

plugin.open("/path/to/plugin"): 插件已加载

从文档中可以看出

Open opens a Go plugin. If a path has already been opened, then the existing *Plugin is returned. 
 It is safe for concurrent use by multiple goroutines.

但是,当我尝试多次加载插件时,情况并非如此。 问题提到了这一点,但建议的修复不适用于较新的版本。

可以在此处找到最小的可重现示例

如有任何帮助,我们将不胜感激:) 提前致谢


正确答案


这是问题 #47298。您无法使用两个不同的 .so 名称加载完全相同的插件。

我可以想到这些可能的解决方法:

  1. 对不同的插件使用唯一的模块路径 (go.mod),并构建整个子文件夹而不是 plugin.go

    plugin1/go.mod

    module plugin1
    . . .

    $ go build -buildmode=plugin -o ../driver/plugin1.so

    plugin2/go.mod

    module plugin2
    . . .

    $ go build -buildmode=plugin -o ../driver/plugin2.so

  2. 从源文件(如 plugin.go)构建时,插件路径是根据源代码的 sha 哈希生成的。因此,您可以在源代码中更改至少 1 个字符,并且您将获得不同的插件路径。

    (修改plugin.go

    $ go build -buildmode=plugin -o ../driver/plugin1.so plugin.go

    $ readelf -aw ../driver/plugin1.so | grep pluginfunc

    - 将打印不同的名称,例如 plugin/unnamed-27fe628be05583084aa4668ab292c47e13b9e93d.pluginfunc

今天关于《加载已完成的插件》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>