在Windows上使用WSL进行Golang的cgo开发?
在Windows上使用WSL进行Golang的cgo开发? 有没有办法在从Windows编译时,利用运行在WSL或WSL2上的Linux发行版中的gcc编译器?
我正尝试在我的Windows机器上编译一个程序,但它使用了sqlite3,所以我需要一个gcc编译器/套件。大多数搜索结果提到像MinGW、TDM或Winsys这样的工具。这些对我来说似乎都是庞大、脆弱且功能繁杂的解决方案,而WSL就在那里,为什么不利用它呢?
这个讨论中的一位发帖者提到了WSL,但没有给出任何细节:
Hi @rlilewis ,
What did go install return? Does it work better if you run go get instead`? I am asking because Go library packages are usually fetched through go get.
我专门搜索了如何使用WSL进行cgo编译,但一无所获。我是不是漏掉了什么?这真的可行吗?
请注意,我的目标是在Windows环境中运行我的测试套件。所以,完全在WSL内部运行整个程序就失去了意义。
更多关于在Windows上使用WSL进行Golang的cgo开发?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
自我回复:我之前关于gcc能够从Linux主机交叉编译到Windows的假设(我原以为可以使用WSL作为主机来实现)是完全错误的。
这篇文章解释说,如果你想这样做,最终会为Debian使用MSYS2。所以基本上是为Debian准备的Windows版gcc…… 


交叉编译Golang (CGO)项目
Golang的优势之一是其开箱即用地支持交叉编译到任何常见的操作系统和CPU架构。然而,这仅适用于纯Go编写的项目。通常这不是问题,但有时我们依赖于…
更多关于在Windows上使用WSL进行Golang的cgo开发?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Windows上使用WSL的gcc进行cgo编译是完全可行的,关键在于正确设置交叉编译环境。以下是具体实现方案:
1. 基础环境配置
首先在WSL中安装必要的工具链:
# 在WSL终端中执行
sudo apt update
sudo apt install gcc g++ mingw-w64
2. 配置Go的交叉编译
在Windows环境中设置Go的环境变量:
# Windows PowerShell或CMD中设置
set GOOS=windows
set GOARCH=amd64
set CGO_ENABLED=1
# 关键:指定使用WSL中的gcc
set CC=/mnt/c/Windows/System32/wsl.exe -- gcc
set CXX=/mnt/c/Windows/System32/wsl.exe -- g++
3. 实际编译示例
以sqlite3为例,创建测试程序:
// main.go
package main
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
)
func main() {
db, err := sql.Open("sqlite3", "./test.db")
if err != nil {
panic(err)
}
defer db.Close()
fmt.Println("SQLite3 database opened successfully")
}
编译命令:
# 在Windows PowerShell中执行
$env:GOOS="windows"
$env:GOARCH="amd64"
$env:CGO_ENABLED="1"
$env:CC="wsl gcc"
$env:CXX="wsl g++"
go build -o program.exe main.go
4. 更完整的配置脚本
创建build.bat脚本:
@echo off
setlocal
:: 设置交叉编译环境
set GOOS=windows
set GOARCH=amd64
set CGO_ENABLED=1
:: 使用WSL中的编译器
set CC=wsl gcc
set CXX=wsl g++
set PKG_CONFIG=wsl pkg-config
:: 设置库文件搜索路径(如果需要)
set CGO_LDFLAGS=-L/mnt/c/path/to/libs
set CGO_CFLAGS=-I/mnt/c/path/to/includes
:: 执行编译
go build -o output.exe main.go
if %ERRORLEVEL% equ 0 (
echo 编译成功: output.exe
) else (
echo 编译失败
)
endlocal
5. 处理依赖库
对于需要链接Linux库的情况,可以在WSL中编译静态库:
# 在WSL中编译静态库
gcc -c -o sqlite3.o sqlite3.c
ar rcs libsqlite3.a sqlite3.o
然后在Windows编译时引用:
$env:CGO_LDFLAGS="-L/mnt/c/Users/YourName/libs -lsqlite3"
go build main.go
6. 使用Makefile统一管理
创建Makefile.windows:
.PHONY: build
build:
export GOOS=windows && \
export GOARCH=amd64 && \
export CGO_ENABLED=1 && \
export CC="wsl gcc" && \
export CXX="wsl g++" && \
go build -o app.exe
test:
export GOOS=windows && \
export GOARCH=amd64 && \
export CGO_ENABLED=1 && \
export CC="wsl gcc" && \
go test -v ./...
在PowerShell中运行:
wsl make -f Makefile.windows build
这种方法确实避免了安装MinGW等工具链,直接利用WSL中的Linux工具链为Windows生成原生可执行文件。关键在于通过wsl gcc命令桥接两个环境,并正确设置Go的交叉编译参数。

