Вот мой код:
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.