在windows下编译go语言编写的dll库

go/cgo 用gcc 编译器(虽然Go 在 Windows 上支持用 MSVC 的 cl.exe 作为 cgo 编译器 ,但真正编译时,会有一个问题,下面有详细的说明)

一、下载并安装 MSYS2(Windows)

https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/msys2-x86_64-latest.exe

  • 默认安装路径建议用:C:\msys64
  • 勾选 "Run MSYS2 now / 运行 MSYS2" 之类的选项(如果有)
  1. 在 MSYS2 UCRT64 里安装 gcc(你现在就在这个窗口)
bash 复制代码
pacman -Syu
pacman -S --needed mingw-w64-ucrt-x86_64-gcc
gcc --version
  1. 在 Windows PowerShell 里让 go/cgo 用 gcc(关键)
    回到 PowerShell:
  • A. 先把 UCRT64 的 bin 加到 PATH(临时)
bash 复制代码
$env:Path = "C:\msys64\ucrt64\bin;" + $env:Path
where.exe gcc
gcc --version
  • B. 配置 Go 使用 gcc
    安装JetBrains 的 goland 工具,把go.exe 安装在了 默认路径下,先在PowerShell设置go的路径
bash 复制代码
$env:Path = "C:\Users\Administrator\go\pkg\mod\golang.org\toolchain@v0.0.1-go1.24.2.windows-amd64\bin;" + $env:Path
go env -w CGO_ENABLED=1
go env -w CC=gcc
go env -w CXX=g++
go env CC CXX CGO_ENABLED
  1. 编译 DLL
bash 复制代码
cd D:\work\go\2026\upfast-go\capi
go build -buildmode=c-shared -o uploader.dll .

运行MSYS2 UCRT64 后,提示 : /usr/bin/cp: cannot stat 'C:\Windows\system32\drivers\etc\hosts': No such file or directory

说明没有找到hosts文件

补上一个文件

右键 PowerShell → "以管理员身份运行"

bash 复制代码
New-Item -ItemType Directory -Force -Path C:\Windows\System32\drivers\etc | Out-Null

@"
# Copyright (c) Microsoft Corp.
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# localhost name resolution is handled within DNS itself.
#    127.0.0.1       localhost
#    ::1             localhost
"@ | Set-Content -Encoding ASCII -Path C:\Windows\System32\drivers\etc\hosts

Go 在 Windows 上支持用 MSVC 的 cl.exe 作为 cgo 编译器

只要确保在"开发者命令行环境"里构建即可

开始菜单 → Visual Studio 2022 文件夹里通常有:

Developer Command Prompt for VS 2022

x64 Native Tools Command Prompt for VS 2022

Developer PowerShell for VS 2022

x64 Native Tools Developer PowerShell for VS 2022

打开其中一个 "x64 Native Tools ..." 就行

env:Path = "C:\\Users\\Administrator\\go\\pkg\\mod\\golang.org\\toolchain@v0.0.1-go1.24.2.windows-amd64\\bin;" + env:Path

在用 MSVC 的 cl.exe 编译时,会报出一个错误 error D8021 :��Ч����ֵ������/Werror

然后用下面的命令 重新编译,就能打印出错误的来源

go build -x -work -buildmode=c-shared -o uploader.dll .

是 Go 在编 runtime/cgo 时自己加了一串 GCC/Clang 风格参数:

从 -x -work 输出可以看到(关键片段):

bash 复制代码
... cgo.exe ... -- ... -O2 -g -Wall -Werror -fno-stack-protector -Wdeclaration-after-statement ...

这套 Go toolchain(用的是 module toolchain go1.24.2)在 Windows 下的 cgo 流程默认按"gcc/clang"来喂参数,所以用 cl 会炸。

要编 -buildmode=c-shared,cgo 必须启用,而 runtime/cgo 这关必过,因此要换成 能吃 -Wall -Werror 的 C 编译器:MinGW-w64 的 gcc 或 clang。

相关推荐
Slow菜鸟几秒前
Codex CLI 教程(五)| AI 驱动项目从零到一:面向 Java 全栈工程师打造个人 ECC(V2版)
java·开发语言·人工智能
lsx2024061 分钟前
Julia 基本运算符
开发语言
2501_9216494931 分钟前
企业定制金融数据 API:从架构设计到 Python 接入实战
大数据·开发语言·python·websocket·金融·量化
直奔標竿34 分钟前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
reasonsummer1 小时前
【教学类-160-13】20260422 AI视频培训-练习013“豆包AI视频《师幼互动》+豆包图片风格:CG动画”
开发语言·python
曹牧1 小时前
Java:处理 HTTP 请求的 Content-Type
java·开发语言
java_logo1 小时前
SiYuan 思源笔记 Docker 部署终极指南:Windows+Linux 双平台
windows·笔记·docker·思源笔记·思源笔记部署·docker部署思源笔记·思源笔记文档
itzixiao1 小时前
L1-066 猫是液体(5分)[java][python]
java·开发语言·python·算法
Lightning-py2 小时前
Python 配置日志(Logging)
开发语言·python
隔窗听雨眠2 小时前
MySQL主从延迟根因诊断法
开发语言·php