环境
- 视窗 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,这个库确实使用了 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在这个文件中定义了未定义的类型和变量。
这是正常行为,还是我错过了什么?