# #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?