【发布时间】: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