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

0 阅读3分钟

GCC编译器的使用

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

1.1、核心基础

  • 核心组件
    • 预处理器(cpp):处理宏定义、头文件包含等;
    • 编译器(cc1/cc1plus):将预处理后的代码编译为汇编代码;
    • 汇编器(as):将汇编代码转为二进制目标文件(.o);
    • 链接器(ld):将目标文件、库文件链接为可执行程序/库。
  • 版本查看
# 查看 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.
  • 文件名后缀的约定
后缀语言类型编译工具
.cC语言gcc
.cpp/.cc/.CC++语言g++
.o目标文件链接阶段
.a静态库链接阶段
.so动态库链接阶段

1.2、基础用法

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

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

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

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

gcc -S main.i -o main.s # 从.i文件生成

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

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

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

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

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

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、多文件编译

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

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

# 链接所有目标文件为可执行文件
gcc main.o fun.o -o app