У меня 2 проекта, первое, имя как A
, есть подмодуль a
import sqlite3 (github.com/mattn/go-sqlite3
). Другой B
проект импортирует подмодуль A
a
, а в другом подмодуле b
он также импортирует тот же sqlite3.
И A
, и B
помещают туда импорт под vendor
dir (управляется govendor
). Моя версия Golang go version go1.12 linux/amd64
.
При сборке B
(go build main.go
) выдает следующие ошибки (слишком много, часть из них):
/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/tmp/go-link-281256755/000029.o: In function `callbackTrampoline':
/tmp/go-build/_cgo_export.c:25: multiple definition of `callbackTrampoline'
/tmp/go-link-281256755/000005.o:/tmp/go-build/_cgo_export.c:25: first defined here
/tmp/go-link-281256755/000029.o: In function `stepTrampoline':
...
/home/xxx/go/src/gitlab.xxxxxxxxx.com/xxxxxxxxx-tools/A/vendor/github.com/mattn/go-sqlite3/sqlite3.go:129: multiple definition of `_sqlite3_result_text'
/tmp/go-link-281256755/000009.o:/home/xxx/go/src/gitlab.xxxxxxxxx.com/xxxxxxxxx-tools/A/vendor/github.com/mattn/go-sqlite3/sqlite3.go:129: first defined here
/tmp/go-link-281256755/000033.o: In function `_sqlite3_result_blob':
...
Но здание A
работает хорошо. Чтобы проверить ошибку, я начал следовать демонстрации, также с vendor
, инициализированной govendor
, и собрал ok.
package main
import (
"database/sql"
"fmt"
"gitlab.xxxxxxxxx.com/xxxxxxxxxxxxxxx/A/a"
_ "github.com/mattn/go-sqlite3"
)
func main() {
fmt.Println(a.ModuleVariable) // use submodule `a` just like B is doing
_, _ = sql.Open(`sqlite3`, `test.db`) // use sqlite too
}
Я думаю, что компилятор сначала компилирует A
sqlite3
, объекты создаются в /tmp/go-link-281256755/000005.o
(, но не этот каталог после сборки ), а затем компилирует B
импорт sqlite3
, а также создание объекта, содержащего функцию с тем же именем, затем компилятор находит 2 символа с тем же именем, связывание не удалось.
Как исправить эту ситуацию? Есть ли какие-либо настройки env golang, чтобы избежать этого?
После удаления пакета sqlite3 в vendor
обоих A
и B
они оба используют sqlite3 в ~/go/src/github.com/mattn/go-sqlite3/
, все они работают нормально. Но я не могу этого сделать из-за платформы развертывания проекта A
, я должен поставить все зависимости в зависимости от поставщика, есть ли другой вариант использования множественного импорта с одним и тем же пакетом?