Linux下编译运行C语言文件(建议收藏)

[复制链接]
发表于 2026-10-3 11:47:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

Linux 下跑一个 C 程序只要三步

没有 IDE、没有图形界面,Linux 终端里编译运行 C 程序其实比想象中简单:写代码 → gcc 编译 → 执行。这篇把这三步跑通,顺便把 gcc 背后「预编译 → 编译 → 汇编 → 链接」四步拆开讲清楚,以后遇到链接错误、宏出问题能自己定位到是哪一步。

一、准备 C 源文件

终端里敲:

vim test.c

进去后先按 i 进入编辑模式,输入:

#include <stdio.h>

int main() {
  printf("HelloWorld!\n");
  return 0;
}

写完按 Esc 退出编辑模式,输入 :wq(注意前面有个冒号)回车保存退出。

如果目录里已经有别的 .c 文件,先 ls 看一下,别覆盖。

二、编译

gcc test.c -o test

再 ls 会发现多了一个可执行文件。-o 指定输出文件名,不写的话默认生成 a.out。

想一次看全编译警告和错误,加 -Wall -Wextra:

gcc -Wall -Wextra test.c -o test

三、执行

./test

输出 HelloWorld! 就成了。相对路径要写 ./,直接敲 test 系统会去 PATH 里找,找不到。

四、gcc 的四步到底在干什么

上面一条 gcc test.c -o test 看着是一步,实际背后串行跑了四道工序,每一步产出一个中间文件:

4.1 预编译(生成 .i)

预处理器 cpp 把源文件和头文件(比如 stdio.h)揉成一个 .i 文件。

gcc -E test.c -o test.i

干五件事:

  • 处理所有 #include 指令,把头文件内容原样展开进来
  • 处理 #define,删掉指令本身并把宏全部展开
  • 处理条件编译 #if / #elif / #else / #ifdef / #ifndef / #endif
  • 删掉所有注释
  • 加行号、文件名标识,方便报错定位

宏出问题(比如用了带参数的宏结果算错)就 gcc -E 看 .i 内容,一眼就能看出展开成什么鬼。

4.2 编译(生成 .s)

编译器 gcc 对预处理后的文件做语法分析、语义分析、优化,产出汇编代码。

gcc -S test.i -o test.s

4.3 汇编(生成 .o)

汇编器把 .s 翻译成机器指令,产出目标文件。

gcc -c test.s -o test.o

这里有个高频踩坑点:是小写 -c,不是大写 -C。写错了大写的,gcc 会把 .s 当源文件重新编译一遍,报出莫名其妙的错。

4.4 链接(生成可执行文件)

链接器 ld 把目标文件和它依赖的所有附加目标文件(静态库、动态库)拼起来,变成能跑的可执行文件。

gcc test.o -o test

五、分步编译的实际用处

  • 大项目只重编改动的那个文件:Makefile 就是靠 gcc -c 只重编变过的 .c,再统一 gcc *.o -o app 链接,省掉全量编译。
  • 查符号/链接错误:动态库符号缺失时,用 nm test.o 看目标文件里到底导出了哪些符号。
  • 看真实优化结果:gcc -S -O2 test.c 直接对源文件出汇编,不用过 .i。
  • 静态链接 vs 动态链接:gcc -static test.c -o test 把依赖库打进去,产出的文件大但换机器能直接跑;默认动态链接产出的文件小,换机器可能缺 libxxx.so 报 error while loading shared libraries。

六、排错速查

  • fatal error: stdio.h: No such file or directory → 没装编译器工具链,sudo apt install build-essential(Debian/Ubuntu)或 sudo yum install gcc glibc-devel(CentOS)。
  • gcc: command not found → 上面那条同时解决,包含 gcc。
  • collect2: error: ld returned 1 exit status → 链接失败,通常是 main 函数名拼错(写成 Main)或漏了库参数。
  • segmentation fault (core dumped) → 运行时崩溃,开 core dump 用 gdb 看栈:ulimit -c unlimited 后 gdb ./test run bt。

小结

日常三条命令记牢:gcc -Wall 源.c -o 目标 一行搞定、./目标 跑起来、出问题时按 -E / -S / -c 拆成四步定位。搞清楚「预编译展开宏、编译出汇编、汇编出机器码、链接拼库」,以后看到 .i/.s/.o 这些后缀就不会一脸懵了。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表