Go compile возвращает дубликаты символов для ошибки архитектуры x86_64, когда я импортирую 2 разных пакета, которые используют пакет C через Cgo - PullRequest
4 голосов
/ 11 июня 2019

Вот мой код:

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. Оба пакета используют одинаковые пакеты hidapi и libusb C для взаимодействия с USB-устройствами.
  2. Эти пакеты C идентичны, следовательно, он определяет те же функции, поэтому я думаю, что это напрямую связано с ошибкой.
  3. в trezord-go/usb, они включают файл .C, а не заголовочный файл.

Это очень нелогично для меня, потому что с точки зрения пользователей пакетов, мне не нужно беспокоиться о том, как пакет C используется во внутреннем пакете, только открытые типы,функции и их поведение.

Может кто-нибудь действительно объяснить, что здесь происходит, и как я могу импортировать их обоих?Они выполняют разные функции, даже если они используют один и тот же пакет C.

1 Ответ

0 голосов
/ 13 июня 2019

Отсюда: https://www.repustate.com/blog/go-duplicate-symbols-for-architecture-x86_64/

"Что это значит? Ну, это означает, что мы пытаемся связать одно и то же имя символа (в нашем случае, метод) из двух (или более) разныхИсходные файлы. Исправить было легко: переименуйте один из методов, обновив заголовочный файл, исходный файл (файл .c или .cpp) и, наконец, обновив ваши ссылки на символ в вашем коде Go, если на него есть прямая ссылка. "

Поможет ли это?

...