常见问题排查
本文档提供 CFDesktop 项目开发和构建过程中常见问题的解决方案。
目录
Docker 相关问题
Docker 未启动
症状:
text
error: Docker daemon is not running!
```text
**解决方案**:
```bash
# Linux
sudo systemctl start docker
sudo systemctl status docker
# macOS/Windows
# 启动 Docker Desktop 应用程序
```text
**验证 Docker 运行状态**:
```bash
docker info
docker run --rm hello-world
```yaml
---
### Docker 镜像构建失败
**症状**: 构建镜像时出现错误
**常见原因和解决方案**:
#### 1. 网络问题
```bash
# 使用国内镜像加速
# 编辑 /etc/docker/daemon.json (Linux) 或 Docker Desktop 设置
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
# 重启 Docker
sudo systemctl restart docker
```text
#### 2. 基础镜像拉取失败
```bash
# 手动拉取基础镜像
docker pull ubuntu:24.04
# 或使用镜像加速
docker pull registry.cn-hangzhou.aliyuncs.com/library/ubuntu:24.04
```text
#### 3. 磁盘空间不足
```bash
# 清理未使用的镜像和容器
docker system prune -a
# 查看 Docker 占用空间
docker system df
```text
#### 4. 构建缓存问题
```bash
# 使用 --no-cache 重新构建
docker build --no-cache -f scripts/docker/Dockerfile.build -t cfdesktop-build .
```yaml
---
### 容器网络问题
**症状**: 容器内无法访问外部网络
**解决方案**:
```bash
# 检查 Docker 网络
docker network ls
docker network inspect bridge
# 重启 Docker 网络服务
sudo systemctl restart docker
# 使用 host 网络模式(Linux)
docker run --rm --network host -v $(pwd):/project cfdesktop-build
```yaml
---
### ARM64 QEMU 仿真慢
**症状**: ARM64 构建非常缓慢(30+ 分钟)
**原因**: x86_64 主机使用 QEMU 仿真 ARM64
**解决方案**:
1. **使用快速构建模式**:
```bash
# 缓存镜像,避免重复构建
bash scripts/build_helpers/docker_start.sh --fast-build --verify
```text
2. **跳过 ARM64 验证**(如果不是必需):
```bash
# 修改 pre-push hook 或使用 --no-verify
git push --no-verify
```yaml
3. **在原生 ARM64 环境构建**:
- 使用 ARM64 服务器/实例
- 使用 Apple Silicon Mac
---
### Windows 路径挂载问题
**症状**: 容器内找不到挂载的目录
**解决方案**:
```bash
# 确保路径使用正确格式
# Docker 需要 POSIX 路径
# Git Bash 自动转换
bash scripts/build_helpers/docker_start.sh
# PowerShell 需要手动转换
$env:MSYS_NO_PATHCONV=1
docker run --rm -v "D:/ProjectHome/CFDesktop:/project" cfdesktop-build
```yaml
---
### 容器内权限问题
**症状**: 容器内无法写入文件
**解决方案**:
```bash
# Linux: 使用当前用户运行
docker run --rm -u $(id -u):$(id -g) -v $(pwd):/project cfdesktop-build
# 或修改文件权限
sudo chown -R $USER:$USER out/
```text
## 构建问题
### 编译错误
**症状**: C++ 编译时出现错误
**常见类型和解决方案**:
#### 1. 头文件未找到
```text
fatal error: some_header.h: No such file or directory
```text
**解决方案**:
```bash
# 检查 CMake_INCLUDE_PATH
# 检查依赖是否正确安装
# Docker 内重新安装依赖
docker run --rm -v $(pwd):/project cfdesktop-build bash -c "
apt-get update && \
bash /project/scripts/dependency/install_build_dependencies.sh
"
```text
#### 2. Qt 版本不匹配
```text
error: 'Qt6::xxx' not found
```text
**解决方案**:
```bash
# 检查 Qt 版本
qmake --version
qmlplugindump --version
# CMakeLists.txt 中指定正确版本
find_package(Qt6 6.8.1 REQUIRED COMPONENTS Core Gui Widgets)
```text
#### 3. C++ 标准问题
```text
error: 'xxx' is not a member of 'std'
```text
**解决方案**:
```cmake
# CMakeLists.txt
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
```yaml
---
### 链接错误
**症状**: 编译成功但链接失败
**常见错误和解决方案**:
#### 1. 未定义引用
```text
undefined reference to 'xxx'
```text
**解决方案**:
```cmake
# 检查链接库是否正确添加
target_link_libraries(your_target
PRIVATE
Qt6::Core
Qt6::Widgets
# 添加缺失的库
)
```text
#### 2. 库文件未找到
```bash
cannot find -lxxx
```text
**解决方案**:
```bash
# 检查库文件路径
ldconfig -p | grep xxx
# 添加库路径
link_directories(/path/to/lib)
```yaml
---
### CMake 配置错误
**症状**: CMake 配置阶段失败
**常见问题**:
#### 1. 构建类型未指定
```text
CMAKE_BUILD_TYPE is not set
```text
**解决方案**:
```bash
# 使用正确的配置脚本
bash scripts/build_helpers/linux_develop_build.sh -c build_develop_config.ini
```text
#### 2. 工具链问题
```text
CMAKE_CXX_COMPILER not set
```text
**解决方案**:
```bash
# 指定工具链
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake -S . -B out/build
# 或使用预设工具链
cmake -DUSE_TOOLCHAIN=linux/llvm -S . -B out/build
```yaml
---
### Qt 相关问题
#### Qt 未找到
```bash
Could not find Qt6
```text
**解决方案**:
```bash
# 设置 Qt 路径
export Qt6_DIR=/path/to/Qt/6.8.1/gcc_64/lib/cmake/Qt6
cmake -DQt6_DIR=/path/to/Qt/6.8.1/gcc_64/lib/cmake/Qt6 -S . -B out/build
```text
#### Qt 模块缺失
```text
Qt6 component 'Widgets' not found
```text
**解决方案**:
```bash
# Docker 内重新安装 Qt
docker run --rm -v $(pwd):/project cfdesktop-build bash -c "
python3 -m aqt install-qt --outputdir /opt linux desktop 6.8.1 gcc_64 -m qtbase qttools
"
```yaml
---
### 测试失败
**症状**: 构建成功但测试失败
**调试步骤**:
```bash
# 详细测试输出
bash scripts/build_helpers/linux_run_tests.sh ci -c build_ci_config.ini --verbose
# 运行特定测试
ctest -R test_name --verbose
# 输出到文件
ctest --output-on-failure > test_results.txt
```text
## Git Hooks 问题
### Pre-Commit 失败
**症状**: 提交时被 Hook 阻止
#### 1. 空白字符检查失败
```text
error: 空白字符检查失败
```text
**解决方案**:
```bash
# 自动修复
bash scripts/develop/remove_trailing_space.sh --staged
# 或强制提交(不推荐)
git commit --no-verify -m "message"
```text
#### 2. clang-format 失败
```text
error: clang-format failed
```text
**解决方案**:
```bash
# 安装 clang-format
sudo apt install clang-format
# 或跳过格式化(删除 Hook 中的格式化部分)
```yaml
---
### Pre-Push 验证失败
**症状**: 推送时被 Hook 阻止
#### 1. 版本号检查失败
```text
error: 版本号未变更,推送被阻止
```text
**解决方案**:
```bash
# 更新版本号
vim CMakeLists.txt # 修改 VERSION x.y.z
# 提交版本变更
git add CMakeLists.txt
git commit -m "chore: bump version to x.y.z"
# 重新推送
git push
```text
#### 2. Docker 构建失败
```text
error: Docker 构建验证失败
```text
**解决方案**:
```bash
# 本地手动验证
bash scripts/build_helpers/docker_start.sh --verify
# 查看详细日志
# 日志保存在 scripts/docker/logger/ci_build_*.log
# 或强制推送(不推荐)
git push --no-verify
```yaml
---
### Hook 未执行
**症状**: Hook 脚本没有运行
**解决方案**:
```bash
# 检查 Hook 是否安装
ls -la .git/hooks/pre-commit .git/hooks/pre-push
# 重新安装
bash scripts/release/hooks/install_hooks.sh
# 检查执行权限
chmod +x .git/hooks/pre-commit .git/hooks/pre-push
```yaml
---
### Git Bash 路径问题
**症状**: Windows Git Bash 中 Hook 路径错误
**解决方案**:
```bash
# 使用 MSYS_NO_PATHCONV=1
export MSYS_NO_PATHCONV=1
# 或修改 Hook 脚本,使用项目根目录的绝对路径
```text
## 性能优化
### 使用快速构建缓存
```bash
# 复用现有 Docker 镜像
bash scripts/build_helpers/docker_start.sh --fast-build
# 结合验证使用
bash scripts/build_helpers/docker_start.sh --fast-build --verify
```yaml
---
### 配置 ccache
```bash
# 在 Docker 容器内配置 ccache
docker run --rm -v $(pwd):/project -v ~/.ccache:/root/.ccache cfdesktop-build
# 或使用环境变量
export CCACHE_DIR=~/.ccache
export CCACHE_MAXSIZE=10G
```yaml
---
### 并行编译调整
```bash
# 限制并行任务数(减少内存压力)
cmake -S . -B out/build -DCMAKE_BUILD_PARALLEL_LEVEL=4
# 或使用 make
make -j4
```yaml
---
### 本地构建(跳过 Docker)
对于频繁的本地开发,可以使用宿主机环境:
```bash
# 设置 Qt 路径
export Qt6_DIR=/path/to/Qt/6.8.1/gcc_64/lib/cmake/Qt6
# 配置和构建
cmake -S . -B out/build -DCMAKE_BUILD_TYPE=Debug
cmake --build out/build --parallel
```yaml
---
### 增量构建
```bash
# 使用快速构建脚本(不清理)
bash scripts/build_helpers/linux_fast_develop_build.sh -c build_develop_config.ini
# 只构建变更的目标
cmake --build out/build --target <specific_target>
```text
## 获取更多帮助
### 查看日志
```bash
# Docker 构建日志
ls scripts/docker/logger/ci_build_*.log
# CMake 配置日志
cat out/build/CMakeFiles/CMakeOutput.log
cat out/build/CMakeFiles/CMakeError.log
```yaml
---
### 调试模式
```bash
# Docker 交互式调试
bash scripts/build_helpers/docker_start.sh
# 在容器内手动运行命令
# CMake 详细输出
cmake -S . -B out/build --trace-expand
# Make 详细输出
make VERBOSE=1
```yaml
---
### 项目资源
- **GitHub Issues**: [提交问题](https://github.com/your-org/CFDesktop/issues)
- **文档首页**: [文档索引](../index.md)
- **开发指南**: [环境准备](./01_prerequisites.md)
- **构建系统**: [构建系统详解](./03_build_system.md)
---
### 联系方式
- **项目维护者**: 通过 GitHub Issues 联系
- **讨论区**: GitHub Discussions
---
### 报告问题模板
提交问题时,请包含以下信息:
```markdown
## 环境信息
- 操作系统: [Ubuntu 24.04 / Windows 11 / macOS 14]
- Docker 版本: [Docker version 24.0.7]
- Qt 版本: [6.8.1]
- CMake 版本: [3.28.0]
## 问题描述
[简要描述问题]
## 复现步骤
1. [步骤 1]
2. [步骤 2]
## 错误信息
```text
[粘贴错误输出]
```text
## 已尝试的解决方案
[列出已尝试的方法]
```text