这是我的代码:
package main
import (
kusb "github.com/karalabe/usb"
tusb "github.com/trezor/trezord-go/usb"
)
func main() {
kusb.Enumerate(0, 0)
tusb.InitHIDAPI(nil)
}
当我编译时(我使用 go mod
来管理包),它返回这个错误:
duplicate symbol _libusb_dev_mem_alloc in:
/var/folders/fm/1rln65d94mn45s0h5l78tdyh0000gp/T/go-link-624554542/000002.o
/var/folders/fm/1rln65d94mn45s0h5l78tdyh0000gp/T/go-link-624554542/000020.o
ld: 136 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
为什么?
我进行了一些调查:
- 这两个包使用相同的
hidapi
和libusb
C 包来与 USB 设备交互。 - 这些 C 包是相同的,因此它定义了相同的函数,所以我认为它与错误直接相关。
- 在
trezord-go/usb
中,它们包括.C
文件,而不是头文件。
这对我来说非常违反直觉,因为从包用户的角度来看,我不需要担心 C 包在包内部是如何使用的,只需要担心公开的类型、函数及其行为。
谁能真正解释这里发生了什么,我如何导入它们?它们执行不同的功能,尽管它们使用相同的 C 程序包。
最佳答案
来自这里:https://www.repustate.com/blog/go-duplicate-symbols-for-architecture-x86_64/
“这是什么意思?好吧,这意味着我们正在尝试从两个(或多个)不同的源文件中链接相同的符号名称(在我们的例子中是一个方法)。修复很简单:重命名其中一个通过更新头文件、源文件(.c 或 .cpp 文件)来更新方法,最后,更新您对 Go 代码中符号的引用(如果在那里直接引用的话)。”
有帮助吗?
关于c - 当我通过 Cgo 导入 2 个使用 C 包的不同包时,Go 编译返回体系结构 x86_64 错误的重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56537928/