在Ubuntu上用MinGW32编译Windows平台Go项目编译报错求助
在Ubuntu下用MinGW交叉编译Windows平台Go项目(CGO_ENABLED=1)时出现ld找不到-ldl的错误
问题场景
- 环境:Ubuntu系统
- 操作:开启CGO(
CGO_ENABLED=1),使用MinGW交叉编译Windows平台的Go项目 - 执行命令:
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CXX=x86_64-w64-mingw32-g++ CC=x86_64-w64-mingw32-gcc go build
- 报错信息:
/usr/bin/x86_64-w64-mingw32-ld: cannot find -ldl: No such file or directory /usr/bin/x86_64-w64-mingw32-ld: cannot find -ldl: No such file or directory collect2: error: ld returned 1 exit status
问题原因
libdl是类Unix系统特有的动态链接库加载库,Windows平台根本不存在这个库。开启CGO交叉编译到Windows时,链接器错误地尝试寻找-ldl,导致编译失败。
解决方法
1. 调整CGO链接参数
如果代码没有直接依赖libdl,可以通过设置CGO_LDFLAGS覆盖默认链接参数,避免链接libdl:
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CXX=x86_64-w64-mingw32-g++ CC=x86_64-w64-mingw32-gcc CGO_LDFLAGS="" go build
如果需要保留其他链接参数,也可以用以下命令跳过不必要的依赖检查:
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CXX=x86_64-w64-mingw32-g++ CC=x86_64-w64-mingw32-gcc CGO_LDFLAGS="-Wl,--no-as-needed" go build
2. 检查并修改代码中的CGO依赖
查看代码或第三方库中是否调用了dlopen、dlsym等类Unix系统的动态链接函数。如果有,需要:
- 替换为Windows平台对应的API(比如
LoadLibrary、GetProcAddress) - 或者用条件编译屏蔽Unix平台的代码:
// +build !windows import "C" // 这里放依赖libdl的CGO代码
同时为Windows平台编写替代实现:
// +build windows // 这里放Windows平台的替代代码,使用Win32 API
3. 确保MinGW工具链完整
执行以下命令安装完整的MinGW交叉编译组件,避免因工具链缺失导致的问题:
sudo apt-get install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64
内容的提问来源于stack exchange,提问作者Moksh Jain
相关产品推荐
相关产品推荐

