ccgo 3.7.2

A high-performance C++ cross-platform build CLI
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
# Docker 构建

使用 CCGO 的 Docker 进行通用跨平台编译构建 C++ 库的完整指南。

## 概述

CCGO 的 Docker 构建实现了**通用跨平台编译** - 从任何主机操作系统为任何平台构建库,无需安装特定平台的工具链。

**主要特性:**

- **随处构建**:在任何操作系统上编译 Linux、Windows、macOS、iOS、watchOS、tvOS、Android
- **零依赖**:无需安装 Xcode、Visual Studio、Android Studio 或 SDK
- **预构建镜像**:使用 Docker Hub 的镜像快速设置(比手动构建快 3-20 倍)
- **一致的环境**:所有开发者使用相同的工具链版本
- **隔离构建**:不与主机系统工具冲突
- **可重现**:保证在不同机器上构建相同

## 为什么使用 Docker 构建?

### 不使用 Docker

**限制:**
- **平台锁定**:iOS/macOS 需要 macOS,MSVC 需要 Windows,Linux 需要 Linux
- **复杂设置**:安装和配置多个 SDK 和工具链
- **版本冲突**:不同项目可能需要不同的工具链版本
- **存储开销**:每个平台的 SDK 可能消耗 10-50GB
- **设置时间**:安装和配置所有工具需要数小时

### 使用 Docker

**优势:**
- **平台无关**:从任何操作系统构建任何平台
- **快速设置**:下载预构建镜像(2-10 分钟)
- **更小的占用空间**:镜像为 800MB-3.5GB vs 10-50GB SDK
- **即时切换**:轻松切换工具链版本
- **CI/CD 就绪**:非常适合自动化构建
- **可重现**:到处都是相同的环境

## 支持的平台

| 平台 | Docker 镜像 | 大小 | 工具链 | 主机操作系统 |
|----------|-------------|------|-----------|---------|
| Linux | `ccgo-builder-linux` | ~800MB | GCC, Clang, CMake | 任意 |
| Windows | `ccgo-builder-windows` | ~1.2GB | MinGW-w64, CMake | 任意 |
| macOS | `ccgo-builder-apple` | ~2.5GB | OSXCross, CMake | 任意 |
| iOS | `ccgo-builder-apple` | ~2.5GB | OSXCross, CMake | 任意 |
| watchOS | `ccgo-builder-apple` | ~2.5GB | OSXCross, CMake | 任意 |
| tvOS | `ccgo-builder-apple` | ~2.5GB | OSXCross, CMake | 任意 |
| Android | `ccgo-builder-android` | ~3.5GB | Android NDK, CMake | 任意 |

**注意**:Apple 平台(macOS、iOS、watchOS、tvOS)共享同一镜像。

## 前置条件

### 安装 Docker Desktop

**macOS:**
```bash
# 从 docker.com 下载或使用 Homebrew
brew install --cask docker

# 启动 Docker Desktop
open -a Docker
```

**Windows:**
```bash
# 从 docker.com 下载 Docker Desktop
# 运行安装程序并重启

# 验证
docker --version
```

**Linux:**
```bash
# Ubuntu/Debian
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker

# 将用户添加到 docker 组
sudo usermod -aG docker $USER
# 注销并重新登录

# 验证
docker --version
```

### 系统要求

- **磁盘空间**:所有 Docker 镜像需要 5-10GB
- **内存**:推荐 4GB+ RAM
- **CPU**:推荐现代多核处理器
- **网络**:首次镜像下载需要快速互联网

## 快速开始

### 基础 Docker 构建

```bash
# 从任何操作系统为 Linux 构建
ccgo build linux --docker

# 从 macOS 或 Linux 为 Windows 构建
ccgo build windows --docker

# 从 Windows 或 Linux 为 macOS 构建
ccgo build macos --docker

# 从 Windows 或 Linux 为 iOS 构建
ccgo build ios --docker

# 从任何操作系统为 Android 构建
ccgo build android --docker
```

### 首次构建(镜像下载)

```bash
# 首次:下载预构建镜像
$ ccgo build linux --docker

正在拉取 Docker 镜像 ccgo-builder-linux:latest...
latest: Pulling from ccgo/ccgo-builder-linux
Digest: sha256:abc123...
Status: Downloaded newer image for ccgo-builder-linux:latest

在 Docker 容器中构建...
[构建输出...]
构建完成!
```

**下载时间(仅首次构建):**
- Linux: ~2-3 分钟(~800MB)
- Windows: ~3-4 分钟(~1.2GB)
- Apple: ~5-8 分钟(~2.5GB)
- Android: ~8-10 分钟(~3.5GB)

### 后续构建

```bash
# 所有后续构建使用缓存的镜像(即时启动)
$ ccgo build linux --docker

使用现有的 Docker 镜像 ccgo-builder-linux:latest...
在 Docker 容器中构建...
[构建输出...]
构建完成!
```

## Docker 构建工作原理

### 构建流程

1. **镜像选择**:CCGO 为目标平台选择适当的 Docker 镜像
2. **镜像下载**:从 Docker Hub 拉取预构建镜像(仅首次)
3. **容器启动**:启动挂载项目目录的 Docker 容器
4. **构建执行**:在容器内使用平台工具链运行构建
5. **输出收集**:将构建制品写入主机文件系统
6. **清理**:删除容器(镜像保持缓存)

### 文件系统挂载

```
主机                          Docker 容器
====                          ================
/project/                 --> /workspace/
  ├── src/                    ├── src/
  ├── include/                ├── include/
  ├── CCGO.toml               ├── CCGO.toml
  └── target/             <-- └── target/
       └── linux/                  └── linux/
```

- **项目目录**以只读方式挂载
- **输出目录**以读写方式挂载
- **构建制品**写入主机文件系统

### 工具链环境

**Linux 容器:**
```bash
# Ubuntu 22.04
gcc 11.4.0
clang 14.0.0
cmake 3.22.1
```

**Windows 容器:**
```bash
# Ubuntu + MinGW-w64
x86_64-w64-mingw32-gcc 10.0.0
cmake 3.22.1
```

**Apple 容器:**
```bash
# Ubuntu + OSXCross
clang 14.0.0 (LLVM)
OSXCross targeting macOS 10.13+
cmake 3.22.1
```

**Android 容器:**
```bash
# Ubuntu + Android NDK
Android NDK r25c
cmake 3.22.1
```

## Docker 镜像管理

### 列出已下载的镜像

```bash
# 列出 CCGO Docker 镜像
docker images | grep ccgo-builder

# 输出:
# ccgo-builder-linux    latest    abc123    2 weeks ago    800MB
# ccgo-builder-windows  latest    def456    2 weeks ago    1.2GB
# ccgo-builder-apple    latest    ghi789    2 weeks ago    2.5GB
```

### 更新镜像

```bash
# 将所有镜像更新到最新版本
docker pull ccgo-builder-linux:latest
docker pull ccgo-builder-windows:latest
docker pull ccgo-builder-apple:latest
docker pull ccgo-builder-android:latest
```

### 删除镜像

```bash
# 删除特定镜像
docker rmi ccgo-builder-linux:latest

# 删除所有 CCGO 镜像
docker rmi $(docker images -q "ccgo-builder-*")

# 回收空间
docker system prune -a
```

### 磁盘空间

```bash
# 检查 Docker 磁盘使用情况
docker system df

# 输出:
# TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
# Images          4         0         7.8GB     7.8GB (100%)
# Containers      0         0         0B        0B
# Local Volumes   0         0         0B        0B
```

## 高级用法

### 构建多个平台

```bash
# 为所有移动平台构建
ccgo build android --docker
ccgo build ios --docker

# 为所有桌面平台构建
ccgo build linux --docker
ccgo build windows --docker
ccgo build macos --docker
```

### 架构选择

```bash
# Android - 多个架构
ccgo build android --docker --arch armeabi-v7a,arm64-v8a,x86_64

# iOS - 为设备和模拟器构建
ccgo build ios --docker --arch arm64,x86_64

# Windows - 不同架构
ccgo build windows --docker --arch x86,x64,arm64
```

### 自定义 Docker 选项

```bash
# 传递自定义 Docker 运行选项
DOCKER_OPTS="--cpus=4 --memory=8g" ccgo build linux --docker

# 挂载额外的卷
DOCKER_OPTS="-v /extra/libs:/libs:ro" ccgo build linux --docker
```

### 并行构建

```bash
# 并行构建多个平台
ccgo build linux --docker &
ccgo build windows --docker &
ccgo build macos --docker &
wait

echo "所有构建完成!"
```

## 平台特定说明

### Linux Docker 构建

**优势:**
- 在 macOS 或 Windows 上构建
- 一致的 glibc 版本
- 同时提供 GCC 和 Clang

**限制:**
- 无法运行 GUI 应用程序
- 无法测试应用程序(没有 X11 显示)

**使用:**
```bash
# 为 x86_64 构建
ccgo build linux --docker --arch x86_64

# 为 ARM64 构建
ccgo build linux --docker --arch arm64

# 使用特定编译器构建
ccgo build linux --docker --compiler clang
```

### Windows Docker 构建

**优势:**
- 在 macOS 或 Linux 上构建
- 无需 Visual Studio

**限制:**
- 仅 MinGW(无 MSVC)
- 输出可能与 MSVC 构建的代码不兼容
- 无法运行 Windows 应用程序

**使用:**
```bash
# 为 x64 构建
ccgo build windows --docker --arch x64

# 为 x86 构建
ccgo build windows --docker --arch x86

# 构建两种架构
ccgo build windows --docker --arch x86,x64
```

**MSVC 兼容性注意事项:**
- Docker 构建使用 MinGW-w64(Windows 的 GCC)
- 对于 MSVC 构建,使用原生 Windows 构建
- MinGW 和 MSVC 有不同的 ABI(二进制不兼容)

### Apple Docker 构建

**优势:**
- 在 Windows 或 Linux 上构建 macOS/iOS/watchOS/tvOS
- 无需 Xcode 或 macOS
- 使用 OSXCross(基于 LLVM)

**限制:**
- 无法对应用程序进行代码签名
- 无法运行或测试应用程序
- 无法公证应用程序
- 无 Xcode 项目生成

**使用:**
```bash
# 为 macOS 构建
ccgo build macos --docker

# 为 iOS 构建
ccgo build ios --docker

# 为多个 Apple 平台构建
ccgo build macos --docker
ccgo build ios --docker
ccgo build watchos --docker
ccgo build tvos --docker
```

### Android Docker 构建

**优势:**
- 在任何操作系统上构建
- 无需 Android Studio
- 一致的 NDK 版本

**限制:**
- 无法在 Android 设备上运行
- 无法生成 Android Studio 项目
- 无法运行测试

**使用:**
```bash
# 为所有 Android 架构构建
ccgo build android --docker --arch armeabi-v7a,arm64-v8a,x86,x86_64

# 构建 AAR 包
ccgo build android --docker --aar
```

## 故障排除

### 找不到 Docker

```
Error: docker command not found
```

**解决方案:**
```bash
# 安装 Docker Desktop 并确保其运行
docker --version

# macOS: 检查 Docker Desktop 是否运行
open -a Docker
```

### 权限被拒绝

```
Error: permission denied while trying to connect to the Docker daemon
```

**解决方案(Linux):**
```bash
# 将用户添加到 docker 组
sudo usermod -aG docker $USER

# 注销并重新登录
# 或使用 sudo 运行(不推荐)
sudo ccgo build linux --docker
```

### 镜像拉取失败

```
Error: Error response from daemon: manifest for ccgo-builder-linux:latest not found
```

**解决方案:**
```bash
# 检查互联网连接
ping docker.io

# 尝试手动拉取
docker pull ccgo-builder-linux:latest

# 检查 Docker Hub 状态
# https://status.docker.com/
```

### 磁盘空间问题

```
Error: no space left on device
```

**解决方案:**
```bash
# 检查磁盘空间
docker system df

# 清理未使用的镜像
docker system prune -a

# 删除特定镜像
docker rmi ccgo-builder-linux:latest
```

### 找不到构建制品

```
Error: Build artifacts not found in target/
```

**解决方案:**
```bash
# 检查 Docker 挂载权限
ls -la target/

# 确保 target 目录存在且可写
mkdir -p target
chmod 755 target

# 检查 Docker 日志
docker logs $(docker ps -lq)
```

### 构建缓慢

```
Docker 内的构建时间太长
```

**解决方案:**
```bash
# 为 Docker 分配更多资源
# Docker Desktop → 首选项 → 资源
# 增加:CPU(4+)、内存(8GB+)、磁盘空间

# 使用 Docker 原生而非虚拟化
#(在 Linux 上更快)

# 启用 BuildKit 以更快地拉取镜像
export DOCKER_BUILDKIT=1
```

## 最佳实践

### 1. 在 CI/CD 中使用 Docker

非常适合自动化构建:

```yaml
# .github/workflows/build.yml
name: Build
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build all platforms
        run: |
          ccgo build linux --docker
          ccgo build windows --docker
          ccgo build macos --docker
```

### 2. 缓存 Docker 镜像

不要在构建之间删除镜像:

```bash
# 保持镜像缓存以快速构建
# 仅在需要时更新
docker pull ccgo-builder-linux:latest
```

### 3. 用于可重现的构建

到处都是相同的环境:

```bash
# 开发
ccgo build linux --docker

# CI/CD
ccgo build linux --docker

# 结果:相同的二进制文件
```

### 4. 与原生构建结合

使用 Docker 进行跨平台,使用原生进行平台特定:

```bash
# 在 macOS 上
ccgo build macos              # 原生(代码签名、测试)
ccgo build linux --docker     # Docker(交叉编译)
ccgo build windows --docker   # Docker(交叉编译)
```

### 5. 定期镜像更新

```bash
# 每月:更新镜像
docker pull ccgo-builder-linux:latest
docker pull ccgo-builder-windows:latest
docker pull ccgo-builder-apple:latest
docker pull ccgo-builder-android:latest
```

### 6. 资源分配

```bash
# 分配足够的资源
# Docker Desktop → 首选项 → 资源:
# - CPU:4-8(更多 = 更快的并行构建)
# - 内存:8-16GB
# - 磁盘:50GB+
```

## 性能优化

### 并行平台构建

```bash
#!/bin/bash
# build-all.sh

echo "构建所有平台..."

ccgo build linux --docker &
PID_LINUX=$!

ccgo build windows --docker &
PID_WINDOWS=$!

ccgo build macos --docker &
PID_MACOS=$!

ccgo build android --docker &
PID_ANDROID=$!

wait $PID_LINUX $PID_WINDOWS $PID_MACOS $PID_ANDROID

echo "所有构建完成!"
```

### 增量构建

Docker 构建支持增量编译:

```bash
# 首次构建(清洁)
ccgo build linux --docker

# 后续构建(增量)
# 仅重新编译更改的文件
ccgo build linux --docker
```

### 资源调整

```bash
# 限制单个构建的 Docker 资源
DOCKER_OPTS="--cpus=2 --memory=4g" ccgo build linux --docker

# 最大资源以更快构建
DOCKER_OPTS="--cpus=8 --memory=16g" ccgo build linux --docker
```

## 安全考虑

### 1. 镜像验证

```bash
# 验证镜像签名(如果可用)
docker trust inspect ccgo-builder-linux:latest

# 检查镜像摘要
docker images --digests | grep ccgo-builder
```

### 2. 网络隔离

```bash
# 无网络访问构建(镜像下载后)
DOCKER_OPTS="--network=none" ccgo build linux --docker
```

### 3. 只读挂载

```bash
# 以只读方式挂载源代码(CCGO 中的默认设置)
DOCKER_OPTS="-v $(pwd):/workspace:ro" ccgo build linux --docker
```

### 4. 用户权限

```bash
# 在容器内以非 root 用户运行(CCGO 默认)
# 输出文件由当前用户拥有
ls -l target/linux/
```

## 比较:原生 vs Docker

| 方面 | 原生构建 | Docker 构建 |
|--------|-------------|-------------|
| **设置时间** | 数小时(SDK 安装) | 数分钟(镜像下载) |
| **磁盘空间** | 每平台 10-50GB | 每平台 800MB-3.5GB |
| **构建速度** | 更快(原生) | 稍慢(~10%) |
| **跨平台** | 有限(需要目标操作系统) | 完整(从任何操作系统到任何目标) |
| **可重现性** | 中等(版本漂移) | 高(固定环境) |
| **代码签名** || 否(Apple 平台) |
| **测试** || 有限/否 |
| **CI/CD** | 复杂 | 简单 |
| **维护** | 手动更新 | 自动(拉取镜像) |

**建议:**
- **开发**:目标平台的原生构建(更好的测试/调试)
- **CI/CD**:所有平台的 Docker(一致性、可重现性)
- **交叉编译**:始终使用 Docker(没有目标操作系统的唯一选项)

## 另请参阅

- [构建系统]build-system.md
- [Linux 平台]../platforms/linux.md
- [Windows 平台]../platforms/windows.md
- [macOS 平台]../platforms/macos.md
- [iOS 平台]../platforms/ios.md
- [Android 平台]../platforms/android.md
- [CCGO.toml 参考]../reference/ccgo-toml.md