174 lines
3.7 KiB
Markdown
174 lines
3.7 KiB
Markdown
# CGO 问题解决方案
|
||
|
||
## 问题说明
|
||
|
||
如果遇到以下错误:
|
||
```
|
||
SQLite 连接失败: Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work
|
||
```
|
||
|
||
这是因为 SQLite 驱动 (`go-sqlite3`) 需要 CGO 支持,但当前二进制文件是在禁用 CGO 的情况下编译的。
|
||
|
||
## 解决方案
|
||
|
||
### 方案 1: 启用 CGO 重新编译(推荐用于 SQLite)
|
||
|
||
#### Windows
|
||
|
||
1. **安装 GCC 编译器**(如果还没有):
|
||
- 下载并安装 [TDM-GCC](https://jmeubank.github.io/tdm-gcc/) 或 [MinGW-w64](https://www.mingw-w64.org/)
|
||
- 确保 GCC 在系统 PATH 中
|
||
|
||
2. **验证 CGO 支持**:
|
||
```powershell
|
||
go env CGO_ENABLED
|
||
```
|
||
应该显示 `1`(如果显示 `0`,需要设置环境变量)
|
||
|
||
3. **启用 CGO 并重新编译**:
|
||
```powershell
|
||
$env:CGO_ENABLED="1"
|
||
go build -o software-download-center.exe .
|
||
```
|
||
|
||
#### Linux/macOS
|
||
|
||
1. **安装 GCC**(如果还没有):
|
||
```bash
|
||
# Ubuntu/Debian
|
||
sudo apt-get install build-essential
|
||
|
||
# macOS
|
||
xcode-select --install
|
||
```
|
||
|
||
2. **启用 CGO 并重新编译**:
|
||
```bash
|
||
export CGO_ENABLED=1
|
||
go build -o software-download-center .
|
||
```
|
||
|
||
### 方案 2: 使用 MySQL 数据库(无需 CGO)
|
||
|
||
如果不想处理 CGO 问题,可以直接使用 MySQL:
|
||
|
||
#### Windows (PowerShell)
|
||
|
||
```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
|
||
|
||
```bash
|
||
# 设置 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
|
||
```
|
||
|
||
#### 使用编译后的程序
|
||
|
||
```powershell
|
||
# 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
|
||
```
|
||
|
||
```bash
|
||
# 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 服务正在运行,并且数据库已创建:
|
||
|
||
```sql
|
||
-- 连接到 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)**:
|
||
```batch
|
||
@echo off
|
||
set CGO_ENABLED=1
|
||
go build -o software-download-center.exe .
|
||
```
|
||
|
||
**Linux/macOS (build.sh)**:
|
||
```bash
|
||
#!/bin/bash
|
||
export CGO_ENABLED=1
|
||
go build -o software-download-center .
|
||
```
|
||
|
||
### 选项 B: 默认使用 MySQL
|
||
|
||
在 `main.go` 或环境配置中设置默认数据库类型为 MySQL。
|
||
|
||
## 检查当前 CGO 状态
|
||
|
||
```bash
|
||
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
|