Golang: множественное определение CGO портированной упаковки - PullRequest
0 голосов
/ 27 мая 2019

У меня 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, я должен поставить все зависимости в зависимости от поставщика, есть ли другой вариант использования множественного импорта с одним и тем же пакетом?

...