Golang跨编译时无法找到模块路径问题

Golang跨编译时无法找到模块路径问题 你好,

我们正在尝试在Linux上为Windows进行交叉编译,但对于某些导入的包遇到了“无法找到模块路径”的错误。这些包不是“Go模块”。

env GOOS=windows go build -x -v -o ourprogram

WORK=/tmp/go-build503773516 build our.company/xxx/xxx: cannot find module for path github.com/xxx/xxx

在Linux上使用GOOS=Linux进行编译是正常的…

你有什么想法吗?

谢谢, 此致, Sylvain


更多关于Golang跨编译时无法找到模块路径问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

在深入讨论交叉编译之前……你能在Windows上本地构建吗?

更多关于Golang跨编译时无法找到模块路径问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


没有人知道为什么在交叉编译时找不到包吗?

是的,在 Windows 上为 Windows 构建时它可以正常工作。(GOOS=windows) 但是当在 Windows 上为 Linux 构建时,我们遇到了同样的问题。(GOOS=linux)

我找到了问题所在:我们使用了CGO,而包含 import "C" 的文件被直接忽略了。但错误信息并没有太大帮助…… 有一个关于此问题的公开议题:https://github.com/golang/go/issues/24068

我安装了 mingw64-gcc 并使用了以下命令:

CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ GOOS=windows GOARCH=amd64 go build

现在一切正常。

这是一个典型的Go模块缓存和跨平台编译路径问题。当使用GOOS=windows进行交叉编译时,Go工具链会尝试为Windows目标重新解析和下载依赖,但可能因为模块缓存或代理配置导致路径查找失败。

首先检查你的模块代理配置和缓存状态:

# 查看当前模块代理配置
go env GOPROXY GOSUMDB

# 清理模块缓存
go clean -modcache

# 验证模块完整性
go mod verify

对于非Go模块的包,你可能需要明确指定构建约束或使用-mod=readonly模式:

# 尝试使用只读模式
env GOOS=windows go build -mod=readonly -o ourprogram

# 或者强制下载所有依赖
env GOOS=windows go mod download

如果问题仍然存在,检查你的go.mod文件中是否正确定义了所有依赖:

# 查看缺失模块是否在go.mod中
grep "github.com/xxx/xxx" go.mod

# 如果没有,添加它
go get github.com/xxx/xxx

对于跨平台编译,确保所有依赖都支持Windows目标。有些包可能有平台特定的构建标签,你可以通过以下方式检查:

// 在代码中添加构建约束检查
// +build windows

package main

import (
    _ "github.com/xxx/xxx"
)

最后,尝试使用完整的构建命令,明确指定模块路径:

env GOOS=windows GOARCH=amd64 CGO_ENABLED=0 \
    go build -trimpath -ldflags="-s -w" \
    -o ourprogram.exe ./cmd/yourprogram

如果问题仍然存在,请提供具体的错误信息和go.mod文件内容,以便进一步分析。

回到顶部