Files
QWQLwToo 079ee4eaeb
build-winui / winui (push) Has been cancelled
Add server components
2026-06-26 13:28:09 +08:00

174 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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