本文介绍了当我通过CGO导入2个使用C包的不同包时,Go Compile返回体系结构的重复符号x86_64错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
以下是我的代码:
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代码中对该符号的引用(如果它直接被引用的话)。"
会有帮助吗?
这篇关于当我通过CGO导入2个使用C包的不同包时,Go Compile返回体系结构的重复符号x86_64错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!