3.7 KiB
3.7 KiB
CGO 问题解决方案
问题说明
如果遇到以下错误:
SQLite 连接失败: Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work
这是因为 SQLite 驱动 (go-sqlite3) 需要 CGO 支持,但当前二进制文件是在禁用 CGO 的情况下编译的。
解决方案
方案 1: 启用 CGO 重新编译(推荐用于 SQLite)
Windows
-
安装 GCC 编译器(如果还没有):
-
验证 CGO 支持:
go env CGO_ENABLED应该显示
1(如果显示0,需要设置环境变量) -
启用 CGO 并重新编译:
$env:CGO_ENABLED="1" go build -o software-download-center.exe .
Linux/macOS
-
安装 GCC(如果还没有):
# Ubuntu/Debian sudo apt-get install build-essential # macOS xcode-select --install -
启用 CGO 并重新编译:
export CGO_ENABLED=1 go build -o software-download-center .
方案 2: 使用 MySQL 数据库(无需 CGO)
如果不想处理 CGO 问题,可以直接使用 MySQL:
Windows (PowerShell)
# 设置 MySQL 环境变量
$env:DB_TYPE="mysql"
$env:DB_HOST="localhost"
$env:DB_PORT="3306"
$env:DB_USER="root"
$env:DB_PASSWORD="your_password"
$env:DB_NAME="software_download_center"
# 运行程序
go run main.go
Linux/macOS
# 设置 MySQL 环境变量
export DB_TYPE=mysql
export DB_HOST=localhost
export DB_PORT=3306
export DB_USER=root
export DB_PASSWORD=your_password
export DB_NAME=software_download_center
# 运行程序
go run main.go
使用编译后的程序
# Windows
$env:DB_TYPE="mysql"
$env:DB_HOST="localhost"
$env:DB_PORT="3306"
$env:DB_USER="root"
$env:DB_PASSWORD="your_password"
$env:DB_NAME="software_download_center"
.\software-download-center.exe
# Linux/macOS
export DB_TYPE=mysql
export DB_HOST=localhost
export DB_PORT=3306
export DB_USER=root
export DB_PASSWORD=your_password
export DB_NAME=software_download_center
./software-download-center
快速测试 MySQL 连接
在运行程序之前,确保 MySQL 服务正在运行,并且数据库已创建:
-- 连接到 MySQL
mysql -u root -p
-- 创建数据库
CREATE DATABASE software_download_center CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 退出
EXIT;
永久解决方案
选项 A: 始终启用 CGO(用于 SQLite)
在编译脚本中设置 CGO_ENABLED=1:
Windows (build.bat):
@echo off
set CGO_ENABLED=1
go build -o software-download-center.exe .
Linux/macOS (build.sh):
#!/bin/bash
export CGO_ENABLED=1
go build -o software-download-center .
选项 B: 默认使用 MySQL
在 main.go 或环境配置中设置默认数据库类型为 MySQL。
检查当前 CGO 状态
go env CGO_ENABLED
1= CGO 已启用(可以使用 SQLite)0= CGO 已禁用(需要使用 MySQL)
常见问题
Q: 为什么需要 CGO?
A: SQLite 的 Go 驱动 (go-sqlite3) 是对 C 库的包装,需要 CGO 来调用 C 代码。
Q: 可以完全避免 CGO 吗?
A: 可以,使用 MySQL 或其他纯 Go 实现的数据库驱动(如 modernc.org/sqlite,但功能可能有限)。
Q: MySQL 需要 CGO 吗?
A: 不需要,MySQL 驱动 (go-sql-driver/mysql) 是纯 Go 实现的。
推荐方案
- 开发环境: 使用 SQLite(需要启用 CGO)
- 生产环境:
- 如果已有 MySQL 服务器,使用 MySQL(无需 CGO)
- 如果希望简单部署,使用 SQLite + CGO