【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
相关推荐
SimonKing2 小时前
企微、QQ统统接入OpenClaw,蓄水池已满,准备养虾
java·后端·程序员
CodeSheep3 小时前
王自如公开招聘01号员工,这要求有多离谱?
前端·后端·程序员
夏同学Xavi2 天前
skls-mgr:统一管理 Agent Skills 的 CLI 工具
人工智能·程序员·命令行
无限大62 天前
职场逻辑04:4步建立良好的职场人际关系,让你左右逢源
程序员
无限大62 天前
数字生存04:在AI时代,如何保持创造力,不被机器取代
程序员
SimonKing2 天前
全网爆火的OpenClaw保姆级教程Linux版,它来了。
java·后端·程序员
无限大63 天前
数字生存03:在AI时代,如何保持工作与生活的平衡
程序员
uzong3 天前
作为面试官,如何针对不同岗位进行合适的面试
程序员
uzong3 天前
技术人职场个人影响力打造:技巧、路径与实战总结
程序员