Невозможно выполнить кросс-компиляцию, если я импортирую "C" - PullRequest
0 голосов
/ 03 марта 2020

Окружающая среда

  • Windows 10
  • Go 1.13.7
GOOS=windows
GOARCH=amd64
CGO_ENABLED=1

Проблема

После дни, когда я пытался сделать кросс-компиляцию моего проекта, я полагал, что если один из моих файлов импортирует «C», то, похоже, go build просто пропустит его.

Вот мой первый файл first.go :

package main

import "C"

type myFirstType struct {
    str string
}

func main() {
    v := myFirstType{str: "Hello"}
    printFirstTypeWithParam(v)
}

А вот второй second.go:

package main

import (
    "fmt"
)

func printFirstTypeWithParam(v myFirstType) {
    fmt.Println(v.str)
}

Когда я запускаю go build, все правильно. Но когда я запускаю env GOOS=linux go build, вот вывод:

# test-package
.\second.go:7:32: undefined: myFirstType

Как только я удаляю строку import "C", все работает отлично.

Почему это проблема?

В реальном проекте я использую gopkg.in / g oracle .v2 , и эта библиотека использует C библиотеки в drv.go:

/*
#cgo CFLAGS: -I./odpi/include -I./odpi/src -I./odpi/embed

#include <stdlib.h>

#include "dpi.c"
*/
import "C"

Когда я запускаю одну и ту же команду сборки в моем проекте (env GOOS=linux go build), вот вывод:

# myproject/vendor/gopkg.in/goracle.v2
vendor\gopkg.in\goracle.v2\drv_10.go:22:2: undefined: ConnectionParams
vendor\gopkg.in\goracle.v2\drv_10.go:23:2: undefined: drv

В этом файле drv.go определены и неопределенный тип, и переменная.

Это нормальное поведение, или я что-то упустил?

1 Ответ

1 голос
/ 03 марта 2020

g oracle перемещено в godror и не поддерживает кросс-компиляцию. Прочитайте ту же проблему здесь: https://github.com/go-goracle/goracle/issues/171

...