c - 当我通过 Cgo 导入 2 个使用 C 包的不同包时,Go 编译返回体系结构 x86_64 错误的重复符号

标签 c go linker blockchain cgo

这是我的代码:

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)

为什么?

我进行了一些调查:

  1. 这两个包使用相同的 hidapilibusb C 包来与 USB 设备交互。
  2. 这些 C 包是相同的,因此它定义了相同的函数,所以我认为它与错误直接相关。
  3. 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/

相关文章:

c - Mmap和结构

database - 定义数据库 ID 常量/变量的最佳实践是什么

mongodb - Golang 和 MongoDb 远程访问失败(服务器在 SASL 身份验证步骤 : Authentication failed. 上返回错误)

c - 尽管为 libusb-1.0 指定了 -l 标志,但 gcc 链接器错误

c++ - 这些链接错误是什么意思? (C++)(MSVC++)

c - 为什么 ld 没有从共享库中找到一些符号

c - 嵌套赋值语句和副作用

c - 在 C 中使用 scanf 匹配常规字符

c - 来自用户空间的 sysfs 文件中的 poll() 和来自内核空间的 sysfs_notify() 不会一起工作

go - 为什么允许 "const true = false"?