【问题标题】:Cannot cross-compile if I import "C"如果我导入“C”,则无法交叉编译
【发布时间】:2020-06-15 14:10:59
【问题描述】:

环境

  • Windows 10
  • 转到 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/goracle.v2,而这个库确实使用了drv.go中的C库:

/*
#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文件中定义了未定义的类型和变量。

这是正常行为,还是我遗漏了什么?

【问题讨论】:

  • 这是正常行为,下载库时默认获取操作系统所需的c文件
  • GOOS中没有办法下载操作系统需要的c文件吗?
  • 据我所知,手动获取文件可能有效。当交叉编译不是一个选项时,我个人使用 vm
  • Go 下载存储库中的任何内容。 C 源文件没有指定它们用于什么操作系统,因此 Go 无法在此基础上排除它们。

标签: linux windows go cross-compiling goracle


【解决方案1】:

goracle 已移至godror 并且不支持交叉编译。在此处阅读相同的问题:https://github.com/go-goracle/goracle/issues/171

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2015-09-27
    • 2021-09-07
    • 2021-09-12
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多