本文介绍了当我通过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)

为什么?

我的一些调查:

  1. 这两个包使用相同的hidapilibusbC包来与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代码中对该符号的引用(如果它直接被引用的话)。"

会有帮助吗?

这篇关于当我通过CGO导入2个使用C包的不同包时,Go Compile返回体系结构的重复符号x86_64错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-01 08:36