Golang Go语言交叉编译的问题

发布于 1周前 作者 h691938207 来自 Go语言

Windows下编写的,Linux相关的那段代码无法通过编译,提示"Unresolved type 'Statvfs_t'"

加了判断根据系统调用不同的函数,也不行吗?

那要怎么解决?


//go:build windows || linux

package main

import ( “fmt” “golang.org/x/sys/windows” “os” “runtime” “syscall” )

// 获取磁盘的可用空间。依次为 可用空间、总空间、剩余空间(包含系统保留) // // 参考 https://stackoverflow.com/a/60724929 func get() (free uint64, total uint64, avail uint64, err error) { wd, err := os.Getwd() if err != nil { return }

switch runtime.GOOS {
case "windows":
	pathPtr, err := windows.UTF16PtrFromString(wd)
	if err != nil {
		return
	}
	err = windows.GetDiskFreeSpaceEx(pathPtr, &free, &total, &avail)
	if err != nil {
		return
	}

case "linux":
	var stat syscall.Statvfs_t
	if err := syscall.Statvfs(wd, &stat); err != nil {
		fmt.Println(err)
		return
	}

	// 块大小 = fragment 大小 * fragment 个数(单位为字节)
	blockSize := uint64(stat.Frsize)
	// 可用空间 = 块大小 * 可用块数(单位为字节)
	free = stat.F_bfree * blockSize
	// 总空间 = 块大小 * 总块数(单位为字节)
	total = stat.F_blocks * blockSize
	// 剩余空间 = 块大小 * 剩余块数(单位为字节)
	avail = stat.F_bavail * blockSize

default:
	return 0, 0, 0, fmt.Errorf("未适配的平台'%s'", runtime.GOOS)
}

return

}


Golang Go语言交叉编译的问题

更多关于Golang Go语言交叉编译的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

分文件,同名函数以及 go build 指定平台

更多关于Golang Go语言交叉编译的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不是在运行时判断,而是在编译时判断

不同平台的代码放在不同 package 里,编译脚本去检测环境,根据环境去全仓库替换包名。

不是都告诉你"Unresolved type ‘Statvfs_t’"了吗…
你类型名字打错了,是 syscall.Statfs_t

关键字 构建约束
添加注释,或者指定文件名就可以了

要分 // +build windows 和 // +build linux 俩文件吧

要分文件加构建约束,而且你打错字了









谢谢,明白怎么处理分开构建了。
另外,确实打错字了。

又有个问题,Goland 不提示另一系统的代码文件中的错误,这又该怎么办?

#8

1 随便打开一个不是当前平台的文件,最上面会弹出一个提示条,点编辑设置。

谢谢,可以了

二楼很一针见血了

关于Golang(Go语言)交叉编译的问题,以下是一些专业解答:

交叉编译是指在一个平台(宿主系统)上生成另一个平台(目标系统)上运行的可执行代码的过程。在Golang中,交叉编译指的是在同一台机器上生成针对不同操作系统或硬件架构的二进制文件。

要实现交叉编译,需要设置两个关键的环境变量:GOOS和GOARCH。GOOS表示目标操作系统,例如darwin代表macOS,linux代表Linux,windows代表Windows。GOARCH表示目标架构,例如amd64代表64位架构,arm代表ARM架构。

例如,要在Windows上为Linux 64位系统编译一个Go程序,可以执行以下命令:

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go

其中,CGO_ENABLED=0用于禁用CGO,因为在交叉编译时不能启用CGO。

编译完成后,可以在目标平台上验证生成的可执行文件是否正常运行。需要注意的是,不同操作系统对文件路径、行结束符以及系统调用的处理可能存在差异,因此在编写跨平台Go程序时需要注意这些潜在的问题。

总之,Golang的交叉编译功能为开发者提供了极大的便利,使得在不同平台上部署Go应用程序变得更加简单和高效。

回到顶部