# 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
