ccgo 3.6.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
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
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
# Linux 平台

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

## 概述

CCGO 提供全面的 Linux 支持:

- **多编译器**:GCC 和 Clang
- **多架构**:x86_64、ARM64 (aarch64)、ARMv7
- **输出格式**:静态库 (.a)、共享库 (.so)
- **构建方式**:本地构建或 Docker(跨平台)
- **IDE 支持**:CodeLite 项目生成
- **发行版兼容**:Ubuntu、Debian、CentOS、Fedora、Alpine
- **C 库变体**:支持 glibc 和 musl

## 前置条件

### 方式 1:本地构建(需要 Linux)

**Ubuntu/Debian:**

```bash
# 安装 GCC 工具链
sudo apt update
sudo apt install -y build-essential cmake pkg-config

# 安装 Clang(可选)
sudo apt install -y clang

# 验证安装
gcc --version
g++ --version
cmake --version
```

**CentOS/Fedora/RHEL:**

```bash
# 安装 GCC 工具链
sudo yum groupinstall -y "Development Tools"
sudo yum install -y cmake

# 或在 Fedora 上
sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y cmake

# 安装 Clang(可选)
sudo yum install -y clang
# 或在 Fedora 上
sudo dnf install -y clang

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

**Alpine Linux:**

```bash
# 安装 GCC 工具链(musl libc)
apk add --no-cache build-base cmake

# 安装 Clang(可选)
apk add --no-cache clang

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

### 方式 2:Docker 构建(任意操作系统)

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

**所需条件:**
- 已安装并运行 Docker Desktop
- 3GB+ 磁盘空间用于 Docker 镜像

**优势:**
- 可在任何操作系统上构建
- 一致的构建环境
- 无需 Linux 依赖
- 支持多个 Linux 发行版

**限制:**
- 无法运行/测试应用程序(除非使用 Docker shell)
- 首次下载较大(~800MB 镜像)

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

## 快速开始

### 基础构建

```bash
# 使用默认编译器为 x86_64 构建
ccgo build linux

# 使用 Docker 构建(从任意操作系统交叉编译)
ccgo build linux --docker

# 指定编译器
ccgo build linux --compiler gcc       # GCC(默认)
ccgo build linux --compiler clang     # Clang
ccgo build linux --compiler auto      # 两个编译器都构建

# 指定架构
ccgo build linux --arch x86_64        # 64位 Intel/AMD(默认)
ccgo build linux --arch arm64         # 64位 ARM (aarch64)
ccgo build linux --arch armv7         # 32位 ARM

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

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

### 生成 CodeLite 项目

```bash
# 生成 CodeLite 工作区
ccgo build linux --ide-project

# 在 CodeLite 中打开
codelite cmake_build/linux/MyLib.workspace
```

## 输出结构

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

```
target/linux/
├── MyLib_Linux_SDK-1.0.0.zip           # 主包
│   ├── lib/
│   │   ├── static/
│   │   │   ├── gcc/
│   │   │   │   └── libmylib.a          # GCC 静态库
│   │   │   └── clang/
│   │   │       └── libmylib.a          # Clang 静态库
│   │   └── shared/
│   │       ├── gcc/
│   │       │   ├── libmylib.so         # GCC 共享库
│   │       │   └── libmylib.so.1.0.0   # 版本化库
│   │       └── clang/
│   │           ├── libmylib.so
│   │           └── libmylib.so.1.0.0
│   ├── include/
│   │   └── mylib/                      # 头文件
│   │       ├── mylib.h
│   │       └── version.h
│   └── build_info.json                 # 构建元数据
│
└── MyLib_Linux_SDK-1.0.0-SYMBOLS.zip   # 调试符号
    └── symbols/
        ├── gcc/
        │   └── libmylib.so.debug       # GCC 调试符号
        └── clang/
            └── libmylib.so.debug       # Clang 调试符号
```

### 库类型

**静态库 (.a):**
- 目标文件的归档
- 编译时链接
- 可执行文件较大
- 无运行时依赖
- 包含所有符号

**共享库 (.so):**
- 运行时动态链接
- 可执行文件较小
- 进程间共享
- 版本化(libmylib.so.1.0.0)
- 兼容性符号链接:
  - `libmylib.so``libmylib.so.1``libmylib.so.1.0.0`

### 构建元数据

`build_info.json` 包含:

```json
{
  "project": {
    "name": "MyLib",
    "version": "1.0.0",
    "description": "My Linux library"
  },
  "build": {
    "platform": "linux",
    "architectures": ["x86_64"],
    "compilers": ["gcc", "clang"],
    "build_type": "release",
    "link_types": ["static", "shared"],
    "timestamp": "2024-01-15T10:30:00Z",
    "ccgo_version": "0.1.0",
    "gcc_version": "11.4.0",
    "clang_version": "14.0.0",
    "libc": "glibc-2.35"
  },
  "outputs": {
    "libraries": {
      "gcc": {
        "static": "lib/static/gcc/libmylib.a",
        "shared": "lib/shared/gcc/libmylib.so"
      },
      "clang": {
        "static": "lib/static/clang/libmylib.a",
        "shared": "lib/shared/clang/libmylib.so"
      }
    },
    "headers": "include/mylib/",
    "symbols": {
      "gcc": "symbols/gcc/libmylib.so.debug",
      "clang": "symbols/clang/libmylib.so.debug"
    }
  }
}
```

## GCC vs Clang

### GCC (GNU 编译器集合)

**优点:**
- 大多数 Linux 发行版的默认编译器
- 优秀的优化
- 广泛的架构支持
- 更好的 C++20/C++23 支持(最新版本)
- 更大的社区

**缺点:**
- 编译速度比 Clang 慢
- 错误消息不如 Clang 友好
- 有时生成的二进制文件更大

**何时使用:**
- 标准 Linux 开发
- 最大兼容性
- 最新的 C++ 标准
- 最佳优化

### Clang (LLVM)

**优点:**
- 更快的编译速度
- 更好的错误消息和警告
- 优秀的静态分析
- 更适合开发
- 模块化架构

**缺点:**
- 可能生成稍慢的代码
- 不太常见作为默认编译器
- 某些架构优化较少

**何时使用:**
- 开发和调试
- 需要更好的诊断信息
- 使用 LLVM 生态系统
- 需要静态分析

## 在 C++ 中使用库

### 链接静态库

**CMakeLists.txt:**

```cmake
# 查找库
find_library(MYLIB_LIBRARY
    NAMES mylib libmylib.a
    PATHS "/path/to/lib/static/gcc"
)

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

**手动编译:**

```bash
# 使用 GCC
g++ -o myapp main.cpp -I/path/to/include -L/path/to/lib/static/gcc -lmylib

# 使用 Clang
clang++ -o myapp main.cpp -I/path/to/include -L/path/to/lib/static/clang -lmylib
```

### 链接共享库

**CMakeLists.txt:**

```cmake
# 查找共享库
find_library(MYLIB_LIBRARY
    NAMES mylib
    PATHS "/path/to/lib/shared/gcc"
)

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

# 设置 RPATH 以便运行时找到库
set_target_properties(myapp PROPERTIES
    BUILD_RPATH "/path/to/lib/shared/gcc"
    INSTALL_RPATH "$ORIGIN:$ORIGIN/../lib"
)
```

**手动编译:**

```bash
# 使用 GCC
g++ -o myapp main.cpp -I/path/to/include -L/path/to/lib/shared/gcc -lmylib \
    -Wl,-rpath,/path/to/lib/shared/gcc

# 使用 LD_LIBRARY_PATH 运行
LD_LIBRARY_PATH=/path/to/lib/shared/gcc ./myapp
```

**在代码中使用:**

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

int main() {
    mylib::MyClass obj;
    obj.do_work();
    return 0;
}
```

## Docker 构建

在任何操作系统上使用 Docker 构建 Linux 库:

### 前置条件

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

# 验证 Docker 运行
docker ps
```

### 使用 Docker 构建

```bash
# 首次构建会下载预构建镜像(~800MB)
ccgo build linux --docker

# 后续构建很快
ccgo build linux --docker --arch x86_64

# 所有标准选项都可用
ccgo build linux --docker --compiler gcc --build-as static
```

### 工作原理

1. CCGO 使用 Docker Hub 的预构建 `ccgo-builder-linux` 镜像
2. 项目目录挂载到容器中
3. 使用 Ubuntu 22.04 + GCC/Clang 构建
4. 输出写入主机文件系统

### 限制

- **无法运行**:Docker 中没有 X11 显示
- **无法测试**:GUI 应用程序无法工作
- 使用 `docker exec -it <container> bash` 运行 CLI 应用

## 发行版兼容性

### glibc vs musl

**glibc (GNU C 库):**
- 大多数发行版的标准
- 更好的性能
- 更广泛的兼容性
- 二进制文件更大

**musl:**
- 用于 Alpine Linux
- 更小更简单
- 静态链接友好
- 严格符合 POSIX

### ABI 兼容性

在较旧的发行版上构建的库通常可在较新的发行版上工作:

```
# 在 Ubuntu 18.04 上构建(glibc 2.27)
# 可在 Ubuntu 20.04、22.04、24.04 上工作

# 在 Ubuntu 22.04 上构建(glibc 2.35)
# 可能无法在 Ubuntu 18.04、20.04 上工作
```

**最佳实践**:在您需要支持的最旧发行版上构建。

### 版本化共享库

CCGO 自动创建版本化的共享库:

```bash
# 创建的文件
libmylib.so.1.0.0         # 带完整版本的实际库
libmylib.so.1             # SONAME 符号链接
libmylib.so               # 开发符号链接

# 检查 SONAME
objdump -p libmylib.so.1.0.0 | grep SONAME
# 输出:SONAME      libmylib.so.1
```

## 平台配置

### CCGO.toml 设置

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

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

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

[linux]
compiler = "gcc"               # gcc、clang 或 auto
libc = "glibc"                 # glibc 或 musl
position_independent_code = true  # 共享库的 PIC
strip_symbols = false          # 剥离调试符号
```

### CMake 变量

为 Linux 构建时:

```cmake
${PLATFORM}                    # "linux"
${ARCHITECTURE}                # "x86_64"、"arm64" 或 "armv7"
${BUILD_TYPE}                  # "Debug" 或 "Release"
${LINK_TYPE}                   # "static"、"shared" 或 "both"
${COMPILER}                    # "gcc" 或 "clang"
${LINUX_LIBC}                  # "glibc" 或 "musl"
```

### 条件编译

```cpp
// 平台检测
#ifdef __linux__
    // Linux 特定代码
    #include <unistd.h>

    #ifdef __x86_64__
        // x86_64 特定代码
    #elif defined(__aarch64__)
        // ARM64 特定代码
    #elif defined(__arm__)
        // ARMv7 特定代码
    #endif
#endif

// 编译器检测
#ifdef __GNUC__
    // GCC 或 Clang
    #define MYLIB_API __attribute__((visibility("default")))

    #ifdef __clang__
        // Clang 特定代码
    #else
        // GCC 特定代码
    #endif
#endif

// glibc 检测
#ifdef __GLIBC__
    // glibc 特定代码
    #include <gnu/libc-version.h>
#endif

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

### 符号可见性

控制共享库中导出的符号:

```cpp
// mylib_export.h
#ifdef __linux__
    #ifdef MYLIB_EXPORTS
        #define MYLIB_API __attribute__((visibility("default")))
    #else
        #define MYLIB_API
    #endif
    #define MYLIB_LOCAL __attribute__((visibility("hidden")))
#else
    #define MYLIB_API
    #define MYLIB_LOCAL
#endif

// 公共 API
class MYLIB_API PublicClass {
public:
    void public_method();
};

// 内部实现(不导出)
class MYLIB_LOCAL InternalClass {
public:
    void internal_method();
};
```

## 最佳实践

### 1. 控制符号可见性

隐藏内部符号以减小库大小并提高加载速度:

```cmake
# CMakeLists.txt
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN YES)
```

```cpp
// 显式导出公共 API
class __attribute__((visibility("default"))) MyPublicClass { ... };
```

### 2. 使用 RPATH 进行分发

设置 RPATH 以便应用程序可以找到共享库:

```cmake
# 将库安装到相对于二进制文件的 lib/ 目录
set_target_properties(myapp PROPERTIES
    INSTALL_RPATH "$ORIGIN:$ORIGIN/../lib"
)
```

目录结构:
```
myapp/
├── bin/
│   └── myapp              # 可执行文件
└── lib/
    └── libmylib.so        # 库
```

### 3. 版本化共享库

为共享库遵循语义版本控制:

```toml
[package]
version = "1.2.3"          # 创建 libmylib.so.1.2.3
```

### 4. 静态链接以简化部署

为了更简单的分发而无需依赖:

```bash
# 仅构建静态库
ccgo build linux --build-as static

# 所有代码都嵌入在可执行文件中
g++ -o myapp main.cpp -I/path/to/include -L/path/to/lib/static -lmylib
```

### 5. 在目标发行版上测试

始终在实际目标发行版上测试:
- Ubuntu 20.04、22.04、24.04
- Debian 11、12
- CentOS 7、8、9
- Fedora(最新版本)
- Alpine(用于 musl)

### 6. 使用位置无关代码

始终为共享库启用 PIC:

```toml
[linux]
position_independent_code = true
```

### 7. 剥离发布二进制文件

减小发布构建的库大小:

```bash
# 剥离调试符号
strip libmylib.so

# 或在 CCGO.toml 中配置
[linux]
strip_symbols = true
```

## 故障排除

### 找不到编译器

```
Error: g++ not found
```

**解决方案:**

```bash
# Ubuntu/Debian
sudo apt install -y build-essential

# CentOS/Fedora
sudo yum groupinstall -y "Development Tools"

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

### 运行时找不到库

```
error while loading shared libraries: libmylib.so: cannot open shared object file
```

**解决方案:**

1. **添加到 LD_LIBRARY_PATH:**
```bash
export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH
./myapp
```

2. **安装到系统目录:**
```bash
sudo cp libmylib.so /usr/local/lib/
sudo ldconfig
```

3. **使用 RPATH(推荐):**
```cmake
set_target_properties(myapp PROPERTIES
    INSTALL_RPATH "$ORIGIN/../lib"
)
```

4. **检查库路径:**
```bash
ldd myapp
# 显示:libmylib.so => not found

# 修复后:
ldd myapp
# 显示:libmylib.so => /path/to/lib/libmylib.so
```

### 找不到符号

```
undefined reference to 'mylib::MyClass::do_work()'
```

**解决方案:**

1. **检查符号是否存在:**
```bash
nm -C libmylib.so | grep do_work
# 应显示:00001234 T mylib::MyClass::do_work()
```

2. **验证库已链接:**
```bash
ldd myapp | grep mylib
# 应显示 libmylib.so
```

3. **检查符号可见性:**
```cpp
// 确保符号已导出
class __attribute__((visibility("default"))) MyClass { ... };
```

### 版本不匹配

```
version `GLIBC_2.35' not found
```

**解决方案:**

在较旧的发行版上构建或使用静态链接:

```bash
# 检查所需的 glibc 版本
objdump -T libmylib.so | grep GLIBC

# 检查系统 glibc 版本
ldd --version

# 在较旧的系统上构建或使用较旧基础镜像的 Docker
```

### CMake 配置失败

```
Could not find a package configuration file provided by "MyLib"
```

**解决方案:**

确保 CMake 可以找到库:

```cmake
# 设置 CMAKE_PREFIX_PATH
set(CMAKE_PREFIX_PATH "/path/to/MyLib/lib/cmake")
find_package(MyLib REQUIRED)

# 或设置为环境变量
export CMAKE_PREFIX_PATH=/path/to/MyLib/lib/cmake
```

## 性能提示

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

```toml
[build]
cxxflags = ["-flto"]       # 启用 LTO
ldflags = ["-flto"]
```

### 2. 启用优化

```toml
[build]
cxxflags = [
    "-O3",                 # 最大优化
    "-march=native",       # 使用 CPU 特定指令
    "-mtune=native"
]
```

### 3. 配置文件引导优化

```bash
# 1. 使用 profiling 构建
CXXFLAGS="-fprofile-generate" ccgo build linux

# 2. 使用典型工作负载运行
./benchmark

# 3. 使用 profile 数据重新构建
CXXFLAGS="-fprofile-use" ccgo build linux
```

### 4. 静态链接以提高性能

由于更好的优化,静态链接可能更快:

```bash
ccgo build linux --build-as static
```

### 5. 禁用异常(如果不需要)

```toml
[build]
cxxflags = ["-fno-exceptions"]
```

## 打包和分发

### 系统包集成

**Debian/Ubuntu (.deb):**

```bash
# 安装 checkinstall
sudo apt install checkinstall

# 创建 .deb 包
cd target/linux
sudo checkinstall --pkgname=mylib --pkgversion=1.0.0 \
    --provides=mylib make install
```

**基于 RPM (.rpm):**

```bash
# 创建 RPM 包
rpmbuild -ba mylib.spec
```

**AppImage(便携式):**

```bash
# 捆绑应用程序及其依赖项
appimagetool myapp.AppDir myapp.AppImage
```

### Snap 包

```yaml
# snapcraft.yaml
name: mylib
version: '1.0.0'
summary: My Linux library
description: Complete C++ library for Linux

parts:
  mylib:
    plugin: cmake
    source: .
```

```bash
# 构建 snap
snapcraft
```

### Flatpak

```json
{
  "app-id": "com.example.mylib",
  "runtime": "org.freedesktop.Platform",
  "sdk": "org.freedesktop.Sdk",
  "command": "myapp"
}
```

```bash
# 构建 flatpak
flatpak-builder build-dir com.example.mylib.json
```

## 迁移指南

### 从 Makefile

**之前:**
```makefile
CC = gcc
CFLAGS = -O2 -Wall
TARGET = libmylib.so

$(TARGET): mylib.o
    $(CC) -shared -o $(TARGET) mylib.o
```

**之后:**

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

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

3. 配置 CCGO.toml:
```toml
[linux]
compiler = "gcc"
```

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

### 从 CMake

**CMakeLists.txt:**
```cmake
project(mylib)
add_library(mylib SHARED src/mylib.cpp)
target_include_directories(mylib PUBLIC include)
```

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

[library]
type = "shared"
```

然后:`ccgo build linux`

### 从 Autotools

**之前:**
```bash
./configure
make
make install
```

**之后:**

1. `src/` 目录提取源文件
2. 使用 `ccgo new` 创建 CCGO 项目
3. 将源文件复制到新项目结构
4. 在 CCGO.toml 中配置依赖项
5. 使用 `ccgo build linux` 构建

## 高级主题

### 交叉编译

为不同架构构建:

```bash
# 在 x86_64 上为 ARM64 构建
ccgo build linux --arch arm64 --docker

# 为 ARMv7 构建
ccgo build linux --arch armv7 --docker
```

### 静态 musl 构建

用于真正可移植的静态二进制文件:

```bash
# 使用 Alpine Linux Docker 镜像
ccgo build linux --docker --libc musl --build-as static
```

### 清理器(Sanitizers)

启用地址清理器进行调试:

```toml
[build]
cxxflags = ["-fsanitize=address", "-fno-omit-frame-pointer"]
ldflags = ["-fsanitize=address"]
```

### 覆盖率分析

```bash
# 使用覆盖率构建
CXXFLAGS="-fprofile-arcs -ftest-coverage" ccgo build linux

# 运行测试
ccgo test

# 生成报告
gcov src/mylib.cpp
lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory coverage_html
```

## 另请参阅

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