【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
相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
Yana.nice5 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
DFT计算杂谈9 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大9 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai10 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang