简 述: 在 uinx/Linux 下,使用 gcc 的工作流程:预处理,编译,汇编,链接。 这里实际测试,举例分析:使用 g++(用 c++)的编译 main.cpp ,最终得到可执行程序的过程分析。
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
编程环境:
💻: MacOS 10.14.6 (18G103)
📎 gcc/g++ 9.2.0
gcc工作流程:
预处理(
gcc -E
; 预处理器cpp) :xxx.c --> xxx.i
(.i 文件本质还是.c 文件)- 宏替换
- 头文件展开
- 注释去掉
编译(
gcc -S
; 编译器 gcc):xxx.i --> xxx.s
- 生成汇编文件
汇编(
gcc -c
; 汇编器as):xxx.s --> xxx.o
- 生成二进制文件
链接(
gcc
; 链接器ld)xxx.o --> xxx(可执行)
gcc常用参数:
-v/--version:
查看版本-I:
指定包含头文件路径(推荐相对路径)-c:
汇编文件生成二进制文件-o:
指定生成文件的名字-g:
gcc调试时候,添加的参数-D:
编译的时候,生成一个你所指定的宏(场景:多使用在测试程序中)-Wall:
gcc 编译时候,添加显示警告⚠️信息-On:
优化代码,n 是优化级别:1,2,3(3 就是最大,填写 100 也是 3)
例子验证:
创建c++源文件:
创建一个 main.cpp 的源文件,内容如下:
#include <iostream> int main(int argc, const char * argv[]) { // insert code here... std::cout << "Hello, World!\n"; return 0; }
gcc 预处理:
g++-9 -E main.cpp -o main.i
原始的 .cpp 文件:
gcc 编译:
g++-9 -S main.i -o main.s
头文件展开,宏替换,去掉注释之后的 .cpp 文件。(.i 文件本质还是 .cpp 文件)
gcc 汇编:
g++-9 -c main.s -o main.o //-c 是小写,非大写C
生成的汇编文件:
gcc 链接:
g++-9 main.s -o main
生成的二进制文件(打开会看到乱码):
运行可执行程序:
./main
终端看到输出结果:Hello, World!