ccgo 3.8.0

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
# Windows 平台

使用 CCGO 为 Windows 构建 C++ 库的完整指南。

## 概述

CCGO 提供全面的 Windows 支持:

- **多工具链**:MSVC(Visual Studio)和 MinGW(GCC)
- **多架构**:x86、x64、ARM64
- **输出格式**:静态库(.lib)、动态库(.dll)
- **构建方式**:本地构建(Visual Studio/MinGW)或 Docker(跨平台)
- **IDE 支持**:Visual Studio 项目生成
- **子系统**:控制台和窗口子系统
- **运行时库**:静态和动态 CRT 链接

## 前置条件

### 方式一:本地构建(需要 Windows)

**使用 MSVC:**
- Windows 10+(64位)
- Visual Studio 2019+ 及 C++ 工作负载
- CMake 3.20+

**安装方法:**

```powershell
# 从 visualstudio.microsoft.com 安装 Visual Studio
# 选择"使用 C++ 的桌面开发"工作负载

# 安装 CMake
# 从 cmake.org 下载或使用 chocolatey
choco install cmake

# 验证安装
cmake --version
cl.exe
```

**使用 MinGW:**
- Windows 10+(64位)
- MinGW-w64 或 MSYS2
- CMake 3.20+

**安装方法:**

```powershell
# 从 msys2.org 安装 MSYS2
# 然后安装 MinGW-w64
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake

# 添加到 PATH
# C:\msys64\mingw64\bin

# 验证
gcc --version
g++ --version
```

### 方式二:Docker 构建(任何操作系统)

在 Linux 或 macOS 上使用 Docker 和 MinGW 构建 Windows 库。

**必需:**
- 已安装并运行 Docker Desktop
- 5GB+ 磁盘空间用于 Docker 镜像

**优势:**
- 在任何操作系统上构建
- 无需 Windows 许可证
- 一致的构建环境
- MinGW-w64 交叉编译

**限制:**
- 仅 MinGW(无 MSVC)
- 无法运行/测试 Windows 应用
- 初始下载较大(约 1.2GB 镜像)

详见 [Docker 构建](#docker-构建)部分。

## 快速开始

### 基本构建

```bash
# 使用默认工具链为 x64 构建
ccgo build windows

# 使用 Docker 构建(MinGW 交叉编译)
ccgo build windows --docker

# 指定工具链
ccgo build windows --toolchain msvc      # MSVC(仅 Windows)
ccgo build windows --toolchain mingw     # MinGW
ccgo build windows --toolchain auto      # 两个工具链(默认)

# 指定架构
ccgo build windows --arch x86            # 32位
ccgo build windows --arch x64            # 64位(默认)
ccgo build windows --arch arm64          # ARM64

# 构建类型
ccgo build windows --build-type debug    # Debug 构建
ccgo build windows --build-type release  # Release 构建(默认)

# 链接类型
ccgo build windows --build-as static    # 仅静态库
ccgo build windows --build-as shared    # 仅 DLL
ccgo build windows --build-as both      # 两种类型(默认)
```

### 生成 Visual Studio 项目

```bash
# 生成 Visual Studio 解决方案
ccgo build windows --ide-project

# 在 Visual Studio 中打开
start cmake_build/windows/msvc/MyLib.sln
```

## 输出结构

### 默认输出 (`target/windows/`)

```
target/windows/
├── MyLib_Windows_SDK-1.0.0.zip          # 主包
│   ├── lib/
│   │   ├── static/
│   │   │   ├── msvc/
│   │   │   │   └── mylib.lib            # MSVC 静态库
│   │   │   └── mingw/
│   │   │       └── libmylib.a           # MinGW 静态库
│   │   └── shared/
│   │       ├── msvc/
│   │       │   ├── mylib.dll            # MSVC DLL
│   │       │   └── mylib.lib            # 导入库
│   │       └── mingw/
│   │           ├── libmylib.dll         # MinGW DLL
│   │           └── libmylib.dll.a       # 导入库
│   ├── bin/                             # DLLs(用于运行时)
│   │   ├── msvc/
│   │   │   └── mylib.dll
│   │   └── mingw/
│   │       └── libmylib.dll
│   ├── include/
│   │   └── mylib/                       # 头文件
│   │       ├── mylib.h
│   │       └── version.h
│   └── build_info.json                  # 构建元数据
│
└── MyLib_Windows_SDK-1.0.0-SYMBOLS.zip  # 调试符号
    └── symbols/
        ├── msvc/
        │   └── mylib.pdb                # MSVC 调试符号
        └── mingw/
            └── libmylib.dll.debug       # MinGW 调试符号
```

### 库类型

**静态库:**
- MSVC:`.lib` 文件
- MinGW:`.a` 文件
- 编译时链接
- 可执行文件更大
- 无运行时依赖

**动态库(DLL):**
- MSVC:`.dll` + `.lib`(导入库)
- MinGW:`.dll` + `.dll.a`(导入库)
- 运行时加载
- 可执行文件更小
- 需要 DLL 在运行时存在

### 构建元数据

`build_info.json` 包含:

```json
{
  "project": {
    "name": "MyLib",
    "version": "1.0.0",
    "description": "My Windows library"
  },
  "build": {
    "platform": "windows",
    "architectures": ["x64"],
    "toolchains": ["msvc", "mingw"],
    "build_type": "release",
    "link_types": ["static", "shared"],
    "timestamp": "2024-01-15T10:30:00Z",
    "ccgo_version": "0.1.0",
    "msvc_version": "19.38",
    "mingw_version": "13.2.0"
  },
  "outputs": {
    "libraries": {
      "msvc": {
        "static": "lib/static/msvc/mylib.lib",
        "shared": "lib/shared/msvc/mylib.dll"
      },
      "mingw": {
        "static": "lib/static/mingw/libmylib.a",
        "shared": "lib/shared/mingw/libmylib.dll"
      }
    },
    "headers": "include/mylib/",
    "symbols": {
      "msvc": "symbols/msvc/mylib.pdb",
      "mingw": "symbols/mingw/libmylib.dll.debug"
    }
  }
}
```

## MSVC vs MinGW

### MSVC(Microsoft Visual C++)

**优点:**
- 微软官方编译器
- 最佳 Windows 集成
- 使用 Visual Studio 的出色调试
- 更好的 Windows 优化
- 与 Windows SDK 兼容

**缺点:**
- 仅 Windows
- 需要 Visual Studio 安装
- 工具链更大

**何时使用:**
- Windows 特定开发
- 需要 Visual Studio 集成
- 最大化 Windows 性能
- 使用 Windows SDK API

### MinGW(Minimalist GNU for Windows)

**优点:**
- 基于 GCC(跨平台兼容)
- 可以从 Linux/macOS 交叉编译
- 工具链更小
- 开源
- 与 Unix 工具兼容

**缺点:**
- 某些 Windows API 未完全支持
- 可能比 MSVC 慢
- 较少 Windows 特定优化

**何时使用:**
- 跨平台开发
- 在非 Windows 系统上构建
- 需要 GCC 兼容性
- 不需要高级 Windows API

## 在 C++ 中使用库

### 链接静态库

**CMakeLists.txt(MSVC):**

```cmake
# 查找库
find_library(MYLIB_LIBRARY
    NAMES mylib
    PATHS "path/to/lib/static/msvc"
)

# 链接到目标
target_link_libraries(myapp PRIVATE ${MYLIB_LIBRARY})
target_include_directories(myapp PRIVATE "path/to/include")
```

**CMakeLists.txt(MinGW):**

```cmake
find_library(MYLIB_LIBRARY
    NAMES mylib libmylib.a
    PATHS "path/to/lib/static/mingw"
)

target_link_libraries(myapp PRIVATE ${MYLIB_LIBRARY})
target_include_directories(myapp PRIVATE "path/to/include")
```

### 链接动态库

**CMakeLists.txt:**

```cmake
# 链接导入库
target_link_libraries(myapp PRIVATE "path/to/lib/shared/msvc/mylib.lib")

# 复制 DLL 到输出目录
add_custom_command(TARGET myapp POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "path/to/bin/msvc/mylib.dll"
        $<TARGET_FILE_DIR:myapp>
)
```

**在代码中使用:**

```cpp
#include <mylib/mylib.h>

int main() {
    // DLL 函数自动解析
    mylib::MyClass obj;
    obj.do_work();
    return 0;
}
```

## Docker 构建

在任何操作系统上使用 Docker 和 MinGW 构建 Windows 库:

### 前置条件

```bash
# 安装 Docker Desktop
# 下载地址:https://www.docker.com/products/docker-desktop/

# 验证 Docker 正在运行
docker ps
```

### 使用 Docker 构建

```bash
# 首次构建下载预构建镜像(约 1.2GB)
ccgo build windows --docker

# 后续构建很快
ccgo build windows --docker --arch x64

# 所有标准选项都可用(仅 MinGW)
ccgo build windows --docker --build-as static
```

### 工作原理

1. CCGO 使用 Docker Hub 的预构建 `ccgo-builder-windows` 镜像
2. 项目目录挂载到容器中
3. 使用 MinGW-w64 交叉编译器构建
4. 输出写入主机文件系统

### 限制

- **仅 MinGW**:无法在 Docker 中使用 MSVC 构建
- **无法运行**:Docker 中没有 Windows 运行时
- **无法测试**:无法执行 Windows 二进制文件

## 平台配置

### CCGO.toml 设置

```toml
[package]
name = "mylib"
version = "1.0.0"

[library]
type = "both"                  # static、shared 或 both

[build]
cpp_standard = "17"            # C++ 标准

[windows]
subsystem = "console"          # console 或 windows
runtime_library = "MD"         # MT、MD、MTd、MDd(仅 MSVC)
windows_sdk_version = "10.0"   # Windows SDK 版本
```

### CMake 变量

为 Windows 构建时:

```cmake
${PLATFORM}                    # "windows"
${ARCHITECTURE}                # "x86"、"x64" 或 "arm64"
${BUILD_TYPE}                  # "Debug" 或 "Release"
${LINK_TYPE}                   # "static"、"shared" 或 "both"
${TOOLCHAIN}                   # "msvc" 或 "mingw"
${WINDOWS_SUBSYSTEM}           # "console" 或 "windows"
${MSVC_RUNTIME_LIBRARY}        # "MD"、"MT" 等(仅 MSVC)
```

### 条件编译

```cpp
// 平台检测
#ifdef _WIN32
    // Windows 特定代码
    #include <windows.h>

    #ifdef _WIN64
        // 64位 Windows
    #else
        // 32位 Windows
    #endif
#endif

// 编译器检测
#ifdef _MSC_VER
    // MSVC 特定代码
    #pragma warning(disable: 4996)
#elif defined(__MINGW32__) || defined(__MINGW64__)
    // MinGW 特定代码
#endif

// DLL 导出/导入
#ifdef MYLIB_EXPORTS
    #define MYLIB_API __declspec(dllexport)
#else
    #define MYLIB_API __declspec(dllimport)
#endif

// 用法
class MYLIB_API MyClass {
public:
    void do_work();
};
```

## 最佳实践

### 1. 支持两个工具链

使用 MSVC 和 MinGW 构建:

```bash
# 构建两者(默认)
ccgo build windows --toolchain auto
```

### 2. 使用正确的 DLL 导出

始终使用 `__declspec(dllexport/dllimport)`:

```cpp
// mylib_export.h
#ifdef _WIN32
    #ifdef MYLIB_EXPORTS
        #define MYLIB_API __declspec(dllexport)
    #else
        #define MYLIB_API __declspec(dllimport)
    #endif
#else
    #define MYLIB_API
#endif
```

### 3. 处理运行时库

选择正确的 CRT 链接:

```toml
[windows]
runtime_library = "MD"  # 动态 CRT(推荐)
# runtime_library = "MT"  # 静态 CRT(更大,无依赖)
```

### 4. 在分发中包含 DLL

始终将 DLL 与二进制文件一起包含:

```
distribution/
├── myapp.exe
├── mylib.dll            # 您的 DLL
└── vcruntime140.dll     # MSVC 运行时(如果需要)
```

### 5. 在目标 Windows 上测试

始终在实际 Windows 系统上测试:
- 不同的 Windows 版本(10、11)
- 不同的架构(x86、x64)
- 有和没有 Visual Studio 安装的情况

## 故障排除

### 未找到 MSVC

```
Error: Could not find MSVC compiler
```

**解决方案:**

```powershell
# 安装带 C++ 工作负载的 Visual Studio
# 或安装生成工具

# 验证
where cl.exe

# 如果需要,添加到 PATH
$env:PATH += ";C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64"
```

### 未找到 MinGW

```
Error: Could not find MinGW compiler
```

**解决方案:**

```bash
# 安装 MSYS2/MinGW
# 添加到 PATH
export PATH="/c/msys64/mingw64/bin:$PATH"

# 验证
gcc --version
g++ --version
```

### 未找到 DLL

```
Error: The code execution cannot proceed because mylib.dll was not found
```

**解决方案:**

1. 将 DLL 复制到可执行文件目录
2. 将 DLL 目录添加到 PATH:
```powershell
$env:PATH += ";C:\path\to\dlls"
```

3. 使用延迟加载(MSVC):
```cmake
target_link_options(myapp PRIVATE "/DELAYLOAD:mylib.dll")
```

### 未找到符号

```
Error: unresolved external symbol
```

**解决方案:**

1. 检查 DLL 导出:
```powershell
dumpbin /EXPORTS mylib.dll
```

2. 验证 __declspec(dllexport):
```cpp
class __declspec(dllexport) MyClass { ... };
```

3. 使用 .def 文件导出:
```
LIBRARY mylib
EXPORTS
    MyFunction
    MyClass
```

## 性能提示

### 1. 使用链接时优化

```toml
[build]
cxxflags = ["/GL"]           # MSVC
ldflags = ["/LTCG"]          # MSVC
# cxxflags = ["-flto"]       # MinGW
```

### 2. 启用优化

```toml
[build]
cxxflags = [
    "/O2",                   # MSVC:优化速度
    "/arch:AVX2"             # 使用 AVX2 指令
]
```

### 3. 独立部署的静态 CRT

用于无需 Visual C++ 可再发行组件的部署:

```toml
[windows]
runtime_library = "MT"       # 静态 CRT
```

## 迁移指南

### 从 Visual Studio 项目

**之前:**
```
MyLib.vcxproj
MyLib.sln
```

**之后:**

1. 创建 CCGO 项目:
```bash
ccgo new mylib
```

2. 复制源文件到 `src/`

3. 配置 CCGO.toml:
```toml
[windows]
subsystem = "console"
runtime_library = "MD"
```

4. 构建:
```bash
ccgo build windows
```

### 从 CMake

**CMakeLists.txt:**
```cmake
project(mylib)
add_library(mylib src/mylib.cpp)
```

**CCGO.toml:**
```toml
[package]
name = "mylib"
version = "1.0.0"
```

然后:`ccgo build windows`

## 另请参阅

- [构建系统]../features/build-system.md
- [依赖管理]../features/dependency-management.md
- [CCGO.toml 参考]../reference/ccgo-toml.md
- [平台概览]index.md