Files
YMhut-box-C-/server/update/CGO_FIX.md
T
QWQLwToo 079ee4eaeb
build-winui / winui (push) Has been cancelled
Add server components
2026-06-26 13:28:09 +08:00

3.7 KiB
Raw Blame History

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 编译器(如果还没有):

  2. 验证 CGO 支持

    go env CGO_ENABLED
    

    应该显示 1(如果显示 0,需要设置环境变量)

  3. 启用 CGO 并重新编译

    $env:CGO_ENABLED="1"
    go build -o software-download-center.exe .
    

Linux/macOS

  1. 安装 GCC(如果还没有):

    # Ubuntu/Debian
    sudo apt-get install build-essential
    
    # macOS
    xcode-select --install
    
  2. 启用 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