You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:26:27