环境

  • 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/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文件中定义。
    这是正常的行为,还是我缺少了什么?

    最佳答案

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

    关于linux - 如果导入“C”,则无法交叉编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60503108/

    10-09 15:20