系统&编译

49 阅读1分钟

编译

GCC/g++

GCC(GNU Compiler Collection)是 GNU 的编译器套件,支持多种编程语言(C、C++、Objective-C、Fortran、Ada 等),而 g++ 是 GCC 中专门用于编译 C++ 代码的前端工具。以下是常用的 GCC 指令及与 g++ 的区别对比:

  • GCC:编译 C 语言程序时,不会自动链接 C++ 标准库。必须显式链接 -lstdc++
  • G++ :自动链接 C++ 标准库,无需手动添加 -lstdc++,并且处理 C++ 语言特性,如函数重载和模板(进行名称修饰(name mangling))

1.编译可执行文件

gcc test.c -o output
g++ test.cpp -o output

gcc -I/path/include test.c -o output

2.仅编译不链接(生成目标.o文件)

gcc -c test.c -o output.o

3.启用调试信息

gcc -g test.c -o output.o

4.链接外部库

gcc test.c -lm -o output #链接数学库

c++程序编译

一句话总结

“C++编译分为预处理、编译、汇编、链接四个阶段,预处理展开宏和头文件,编译生成汇编代码,汇编转换为机器码,链接合并目标文件和库。通过 g++ 命令控制优化、警告和标准,静态/动态链接决定库的绑定方式。”

1. 编译流程(4个核心阶段)
  1. 预处理(Preprocessing)

    • 处理 # 开头的指令(如 #include#define),生成纯C++代码(.i 文件)。
    • 命令:g++ -E main.cpp -o main.i
  2. 编译(Compilation)

    • 将预处理后的代码转换为汇编代码.s 文件)。
    • 语法分析、语义分析、优化等在此阶段完成。
    • 命令:g++ -S main.i -o main.s
  3. 汇编(Assembly)

    • 将汇编代码转换为机器码(目标文件 .o
    • 命令:g++ -c main.s -o main.o
  4. 链接(Linking)

    • 合并多个目标文件(如 main.outils.o)和库文件(如 libstdc++.a),生成可执行文件。
    • 解决符号引用(如函数、全局变量)。
    • 命令:g++ main.o utils.o -o app