# 编译说明 - 兼容旧版本系统

## 问题说明

如果在 Debian 11 或其他旧版本系统上运行时出现 GLIBC 版本错误：
```
./mengyamonitor-backend: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found
```

这是因为编译时使用了较新版本的 GLIBC，而目标系统的 GLIBC 版本较旧。

## 解决方案

### 方案 1：在目标系统上编译（推荐）

在 Debian 11 服务器上直接编译：

```bash
cd mengyamonitor-backend

# 禁用 CGO，静态链接
export CGO_ENABLED=0
go build -ldflags="-s -w" -o mengyamonitor-backend .

# 或者使用提供的脚本
chmod +x build.sh
./build.sh
```

### 方案 2：使用静态链接编译

在任何系统上编译，但使用静态链接：

```bash
cd mengyamonitor-backend

# 禁用 CGO
export CGO_ENABLED=0
export GOOS=linux
export GOARCH=amd64

# 编译（静态链接，不依赖系统库）
go build -ldflags="-s -w" -o mengyamonitor-backend .
```

### 方案 3：使用 Docker 编译

使用 Docker 在 Debian 11 环境中编译：

```bash
# 使用 Debian 11 镜像编译
docker run --rm -v $(pwd):/app -w /app golang:1.21-bullseye sh -c "
    export CGO_ENABLED=0
    go build -ldflags='-s -w' -o mengyamonitor-backend .
"

# 或者使用多阶段构建
docker build -t mengyamonitor-backend -f Dockerfile.build .
```

## 验证编译结果

编译完成后，检查二进制文件：

```bash
# 检查文件类型
file mengyamonitor-backend

# 检查依赖（如果是静态链接，应该显示 "not a dynamic executable"）
ldd mengyamonitor-backend

# 检查 GLIBC 依赖（应该没有或很少）
objdump -T mengyamonitor-backend | grep GLIBC
```

## 编译参数说明

- `CGO_ENABLED=0`: 禁用 CGO，使用纯 Go 实现，不依赖系统 C 库
- `-ldflags="-s -w"`: 减小二进制文件大小
  - `-s`: 省略符号表和调试信息
  - `-w`: 省略 DWARF 符号表

## 注意事项

1. 禁用 CGO 后，某些需要 C 库的功能可能不可用，但本项目不依赖 CGO
2. 静态链接的二进制文件会稍大一些，但兼容性更好
3. 如果必须使用 CGO，需要在目标系统上编译，或使用相同 GLIBC 版本的系统编译

