【c 语言】linux下gcc编译工具的使用

GCC编译器的使用

GCC(GNU Compiler Collection)是 Linux 下最核心的编译工具链,支持 C、C++、Objective-C、Fortran 等多种语言,是开发和运维中编译程序、排查编译问题的必备工具。

1.1、核心基础

  • 核心组件
    • 预处理器(cpp):处理宏定义、头文件包含等;
    • 编译器(cc1/cc1plus):将预处理后的代码编译为汇编代码;
    • 汇编器(as):将汇编代码转为二进制目标文件(.o);
    • 链接器(ld):将目标文件、库文件链接为可执行程序/库。
  • 版本查看
bash 复制代码
# 查看 GCC 版本
gcc@gcc:~/2026/c$ gcc --version
gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# # C++ 编译版本(GCC 对 C++ 的封装)
gcc@gcc:~/2026/c$ g++ --version
g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  • 文件名后缀的约定
后缀 语言类型 编译工具
.c C语言 gcc
.cpp/.cc/.C C++语言 g++
.o 目标文件 链接阶段
.a 静态库 链接阶段
.so 动态库 链接阶段

1.2、基础用法

  • 一步生成可执行文件
bash 复制代码
# 编译c程序,生成默认可执行文件a.out
gcc main.c

# 编译 C++ 程序,生成默认可执行文件 a.out
gcc main.cpp

# 通过-o指定输出程序的文件名
gcc main.c -o main
  • 分步编译(4个阶段) 阶段1,预处理(-E),生成预处理后的文件(.i)。进行宏展开、删除注释、头文件包含
bash 复制代码
gcc -E main.c -o main.i

阶段2,编译(-S),生成汇编代码(.s)

bash 复制代码
gcc -S main.i -o main.s # 从.i文件生成

# 直接从.c文件生成
gcc -S main.c -o main.s

阶段3,汇编(-c),生成目标文件(.o)

bash 复制代码
gcc -c main.s -o main.o # 从.s文件生成

# 直接从.c文件生成
gcc -c main.c -o main.o

阶段4,链接,生成可执行文件

bash 复制代码
gcc  main.o -o main # 从.o文件生成

# 直接从.c文件生成,指定执行4个步骤
gcc main.c -o main

1.3、核心常用选项

  • 基础编译
    • -o file:指定输出文件名;
    • -E:只进行预处理,不编译和汇编;
    • -S:只进行预处理和编译,不进行汇编;
    • -c:进行预处理、编译和汇编。
  • 警告与调试
    • -Wall:开启所以常用警告(推荐),还是会编译成功生成目标文件;
    • -Werror:将所有警告都变为错误,编译失败;
    • -g:生成调试信息,用于gdb调试;
    • -ggdb:生成gdb专用调试信息(更全)。
  • 优化(性能)
    • -o0:默认,不优化(调试用);
    • -o1:基础优化(速度/体积平衡)
    • -o2:常用优化,发布版本推荐;
    • -o3:激进优化,速度快,体积更大;
    • -os:优化体积最小,一般用于嵌入式;
  • 指定标准与宏
    • -std=c99 / c11 / gnu11:指定C标准;
    • -D MACR0:定义宏(例如:DEBUG=1);
    • -U MACR0:取消宏定义。
  • 路径与库
    • -I dir:添加头文件搜索路径;如-I ./include;用于头文件不在系统默认路径(/usr/include/usr/local/include)时;
    • -L dir:添加库文件搜索路径;如-L ./lib;
    • -l lib:链接指定的库,如-lm会链接libm.so库(省略 lib 前缀和 .a/.so 后缀);
    • -static:静态链接,库会嵌入到程序中,无依赖;
    • -shared -fPIC生成动态库.so(-fPIC 位置无关代码)。

! 注意\] 运行时动态库找不到问题 * 临时:`LD_LIBRARY_PATH=库路径 ./程序`; * 永久:将库路径添加到 `/etc/ld.so.conf`,执行 `ldconfig`; * 编译时指定运行库路径:`gcc main.c -o main -L./ -ltest -Wl,-rpath=./`。

  • 输出编译过程
    • -v:查看 GCC 编译的详细过程(包括预处理器、编译器、链接器的调用命令),用于排查编译 / 链接问题

1.4、多文件编译

程序包含多个源文件时使用:

  • 一次性编译
bash 复制代码
gcc main.c fun.c -o app
  • 分步编译
bash 复制代码
# 先将多个源文件编译为目标文件
gcc -c main.c -o main.o
gcc -c fun.c -o fun.o

# 链接所有目标文件为可执行文件
gcc main.o fun.o -o app
相关推荐
程序员cxuan2 小时前
今天看到很多人讨论 Linux 终于要接受 AI 提交的代码了,我的第一反应是,真的吗?作为喷 AI 最狠的祖师爷到底咋看这件事儿?
后端·程序员
阿里嘎多学长5 小时前
2026-04-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
人邮异步社区6 小时前
为什么需要学习计算机组成原理?
程序员·计算机系统·计算机原理
拥抱AGI7 小时前
Qwen3.5开源矩阵震撼发布!从0.8B到397B,不同规模模型性能、显存、速度深度对比与选型指南来了!
人工智能·学习·程序员·开源·大模型·大模型训练·qwen3.5
SimonKing7 小时前
大V说’AI替代不了你’,但现实是——用AI的人正在替代你
java·后端·程序员
虚无境18 小时前
关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法
程序员·openai·ai编程
田八21 小时前
聊聊AI的发展史,AI的爆发并不是偶然
前端·人工智能·程序员
我要让全世界知道我很低调1 天前
来聊聊 Codex 高效编程的正确姿势
前端·程序员