# 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