在Linux系统中,编译C程序主要依赖GNU Compiler Collection(GCC),这是Linux下最常用的C语言编译器,本文将从安装编译器、编写代码到编译、链接、调试等步骤,详细说明如何在Linux环境下完成C程序的编译与运行。

安装GCC编译器
大多数Linux发行版默认未安装GCC,需手动安装,以常见发行版为例:
- Ubuntu/Debian:使用
apt命令,执行sudo apt update && sudo apt install build-essential(build-essential包含GCC、make等基础编译工具)。 - CentOS/RHEL:使用
yum或dnf,执行sudo yum groupinstall "Development Tools"(或sudo dnf groupinstall "Development Tools")。
安装完成后,可通过gcc --version验证是否安装成功(显示版本号即表示成功)。
编写C程序
使用文本编辑器(如vim、nano或gedit)创建C源文件,扩展名为.c,创建hello.c如下:
#include <stdio.h>
int main() {
printf("Hello, Linux!n");
return 0;
}
保存后,可通过ls命令查看文件是否存在,cat hello.c无误。
编译与运行C程序
基础编译
使用gcc命令编译源文件,基本语法为gcc [选项] 源文件名。
gcc hello.c
编译成功后,当前目录会生成a.out(默认可执行文件名),运行命令为:
./a.out
输出结果应为Hello, Linux!。
指定可执行文件名
通过-o选项自定义输出文件名,避免默认覆盖:

gcc hello.c -o hello
此时生成hello可执行文件,运行./hello即可。
GCC常用参数说明
| 参数 | 作用 | 示例 |
|---|---|---|
-c |
只编译不生成可执行文件,生成.o目标文件 |
gcc -c hello.c(生成hello.o) |
-g |
包含调试信息,便于使用GDB调试 | gcc -g hello.c -o hello |
-O |
优化代码级别(-O0不优化,-O1/-O2/-O3逐级优化) |
gcc -O2 hello.c -o hello |
-I |
指定头文件搜索路径 | gcc -I /usr/include/mylib hello.c |
-L |
指定库文件搜索路径 | gcc -L /usr/lib/mylib hello.c -lmath |
-l |
链接指定库(省略lib前缀和.a/.so后缀) |
gcc hello.c -lm(链接数学库) |
多文件编译与链接
实际开发中,项目常包含多个源文件和头文件,假设有main.c、utils.c和utils.h:
utils.h:声明函数utils.c:定义函数main.c:调用函数
编译时需将所有.c文件一起链接:
gcc main.c utils.c -o program
也可先生成目标文件再链接:
gcc -c main.c -o main.o gcc -c utils.c -o utils.o gcc main.o utils.o -o program
使用Makefile管理编译
多文件项目中,手动编译命令繁琐,可通过Makefile自动化管理,上述多文件项目的简单Makefile:
CC=gcc
CFLAGS=-Wall -g
TARGET=program
SRCS=main.c utils.c
OBJS=$(SRCS:.c=.o)
$(TARGET): $(OBJS)
$(CC) $(OBJS) -o $(TARGET)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
执行make即可编译,make clean清理生成的文件。
| Makefile元素 | 说明 |
|---|---|
CC |
指定编译器 |
CFLAGS |
编译选项(如-Wall显示所有警告) |
TARGET |
目标可执行文件名 |
SRCS |
源文件列表 |
OBJS |
目标文件列表(由SRCS自动生成) |
%.o: %.c |
规则:将.c编译为.o |
clean |
清理命令(删除.o和可执行文件) |
调试与优化
使用GDB调试
编译时需加-g选项(包含调试信息),例如gcc -g hello.c -o hello,然后启动GDB:

gdb hello
常用GDB命令:
break main(在main函数设置断点)run(运行程序)next(单步执行,不进入函数)step(单步执行,进入函数)print 变量名(查看变量值)continue(继续运行至断点)quit(退出GDB)
代码优化
通过-O选项优化代码,平衡性能与编译时间:
-O0:不优化(默认,适合调试)-O1:基本优化(提升少量性能)-O2:推荐优化(大多数场景使用)-O3:高级优化(可能增加代码体积)
FAQs
编译时提示“undefined reference to”错误,是什么原因?如何解决?
解答:该错误表示链接阶段找不到函数的定义,常见原因包括:
- 忘记链接对应的库(如使用数学函数未加
-lm); - 函数声明与定义不一致(如参数类型错误);
- 头文件包含正确,但
.c文件未编译或未链接。
解决方法:检查函数拼写、确认是否需要链接库(如gcc main.c -lm),或确保所有源文件均参与编译。
程序编译通过但运行时报“段错误(Segmentation fault)”,如何排查?
解答:段错误通常因程序访问了未授权内存(如空指针、数组越界、栈溢出)导致,排查步骤:
- 使用
gdb调试:通过backtrace命令查看崩溃时的调用栈,定位问题代码; - 检查指针是否初始化(如
int *p = NULL;); - 验证数组访问是否越界(如
int arr[5]; arr[5] = 10;); - 使用
valgrind工具检测内存错误(如valgrind ./program)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/23772.html