Golang — Дублирующий символ, когда несколько библиотек с одинаковыми библиотеками C

# #go #build #linker-errors #cgo

Вопрос:

Когда я пытаюсь создать программу Go, содержащую несколько библиотек, которые импортируют одни и те же библиотеки C через CGO, я получаю duplicate symbol ошибки.

Вот несколько примеров кода

 package main

import (
    _ "github.com/karalabe/usb"
    _ "github.com/trezor/trezord-go/usb"
)

func main() {
}
 

Когда я пытаюсь это построить, я получаю такие ошибки, как:

 /Users/tlainevool/.asdf/installs/golang/1.14.2/go/pkg/tool/darwin_amd64/link: running clang failed: exit status 1
duplicate symbol _hid_read_timeout in:
    /var/folders/5f/r8k9s56d5wbfpx5sj9d739pwnv1297/T/go-link-572074318/000002.o
    /var/folders/5f/r8k9s56d5wbfpx5sj9d739pwnv1297/T/go-link-572074318/000016.o
duplicate symbol _hid_get_feature_report in:
    /var/folders/5f/r8k9s56d5wbfpx5sj9d739pwnv1297/T/go-link-572074318/000002.o
    /var/folders/5f/r8k9s56d5wbfpx5sj9d739pwnv1297/T/go-link-572074318/000016.o
 

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

Есть ли какой-нибудь способ заставить clang распознавать символы из двух разных библиотек как одни и те же? Или они должны быть в разных пространствах имен или что-то в этом роде?

Комментарии:

1. go mod vendor перед запуском скрипт, похоже, решил проблему.

2. Мне показалось, что это не сработало. У меня появились новые ошибки vendor/github.com/trezor/trezord-go/usb/lowlevel/libusb/libusb.go:50:11: fatal error: 'os/threads_posix.c' file not found , похоже, поставщик не извлекает все файлы C, необходимые для CGO?