【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
相关推荐
2301_815482932 小时前
C++编译期矩阵运算
开发语言·c++·算法
liulilittle2 小时前
LINUX RING BUFFER TUN/TAP 1
linux·服务器·网络·c++·信息与通信·通信
supersolon2 小时前
WSL2(Linux)升级docker
linux·运维·docker·wsl·升级
always_TT2 小时前
结构体数组与初始化
c语言
☆5662 小时前
C++中的类型擦除技术
开发语言·c++·算法
m0_569881472 小时前
C++与自动驾驶系统
开发语言·c++·算法
天理小学渣2 小时前
JavaScript_基础教程_自学笔记
开发语言·javascript·笔记
難釋懷2 小时前
Lua语法入门-变量和循环
开发语言·junit·lua
csbysj20202 小时前
CSS 颜色
开发语言