惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Stack Overflow Blog
Stack Overflow Blog
S
SegmentFault 最新的问题
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
U
Unit 42
GbyAI
GbyAI
B
Blog RSS Feed
博客园 - Franky
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
Google Developers Blog
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - smil、梵音

css渐变边框的实现 C primer Plus 第六版第4章节复习题5记录 C语言第4章末尾程序找错记录 css 的z-index的层级问题 由webai项目的 AI工作台 项目有感记录 C语言标准(C89/C90)中的32个关键字全列表 Windows 系统的 vscode 通过 Remote-SSH 连接虚拟机的 Ubuntu 系统运行 C 语言的代码 Windows 系统 vscode Remote-SSH 远程连接虚拟机里面的Ubuntu系统的失败处理 Ubuntu虚拟机里安装了SSH,开启SSH服务的时候报错 VS Code的Remote - SSH功能 Ubuntu系统里面安装 g++ ,sudo apt update 的含义 c语言用gcc编译过后,执行 ./hello.c 报错 ./hello.c: 权限不够 windows系统的虚拟机里面的Ubuntu系统安装VMware Tools Ubuntu的应用中心搜索 vscode 的时候,筛选条件为Snap包、debian包是什么意思,如何安装vscode Ubuntu系统是否就是Linux系统,安装软件和Windows系统有何区别 Ubuntu系统里面vscode运行C语言的第一个 Hello World 程序 vscode 中安装C/C++相关的插件 Ubuntu 安装一个轻量级的中文输入法Fcitx5 Ubuntu安装百度网盘 Ubuntu系统里面安装vscode 乌版图系统截屏快捷键 Ubuntu 系统里面运行C++ TortoiseGit 的安装与汉化 安装虚拟机+ ubuntu24.04 系统 联想小新安装 ubuntu24.04 双系统 | 安装乌版图系统 | windows安装 ubuntu24.04 双系统 利用faststone capture制作gif动图 Sublime Text 常用编辑快捷键速查表 vscode 中的 css 样式代码不显示折叠图标的解决方法 IDEA中git的Cherry-Pick的可视化使用(个人总结) IDEA中git的Cherry-Pick的使用 IDEA中如何实现git的cherry-pick可视化操作?
C语言是不是必须得通过gcc编译成可执行的程序?
smil、梵音 · 2026-06-22 · via 博客园 - smil、梵音

问题:

我能不能理解为 gcc hello.c -o hello 是编译,./hello.c 是运行?为什么一定要通过-o输出?我是不是不能直接运行 .c 的文件?是不是以后工作了,都得通过编译 .c 的文件,然后生成一个可执行的程序?因为我是初学者,还不明白以后的工作流程。

答案:

你的理解对了一半,但最关键的一步理解错了,我帮你彻底厘清一下,这对你以后理解编程至关重要。

1. 关于你的理解:“gcc hello.c -o hello 是编译,./hello.c 是运行”?

前半句对,后半句错。

  • gcc hello.c -o hello 确实是编译(更准确地说是“编译+链接”)。

  • ./hello.c 不是运行,这是你试图去“执行”一个文本文件。

正确的运行命令是:

(注意:没有 .c 后缀,名字和 -o 后面跟的名字必须一致)

2. 为什么一定要通过 -o 输出?能不能不写?

可以不写。 如果你只输入:

系统也会编译成功,但它会默认生成一个名字叫 a.out 的文件。这时候你需要运行 ./a.out

为什么老师/教程都强调要加 -o
因为如果你写了好几个练习程序(比如 hello.cmath.carray.c),每次都默认生成 a.out,后面的会把前面的覆盖掉,你就分不清谁是谁了。
-o 的作用就是“起名字”,让你生成的文件叫 hellomatharray,一目了然。

3. 我是不是不能直接运行 .c 的文件?

绝对不能。 原因很简单:

  • .c 文件里写的是人类认识的英文和符号#include, printf)。

  • 电脑的 CPU 只认识 0 和 1(机器码),它完全看不懂 #include 是什么意思。

所以必须通过 gcc 这个“翻译官”,把你的英文代码翻译成 CPU 认识的 0 和 1,生成一个可执行文件(在 Linux 下就是 hello 这种没有后缀的文件)。你直接运行 .c 文件,系统会报错“权限不够”或“无法执行二进制文件”,因为它根本看不懂。

打个比方.c 文件就像一份中文写的“施工图纸”(人类看得懂),而 gcc 是施工队,-o 生成的文件是盖好的“大楼”(机器能住进去运行)。你不能把一张图纸直接当房子住进去,对吧?

4. 以后工作了,是不是都得先编译再运行?

是的,只要是 C/C++ 语言,这编译的步骤永远躲不掉。 但工作后的“编译方式”会和你现在不太一样。

  • 现在(学习阶段):你只有一个 .c 文件,所以手敲 gcc hello.c -o hello 最直接。

  • 以后(工作/项目阶段):一个项目可能有几百个 .c.h 文件。如果还一个个手敲 gcc,会累死人。所以工作后用 MakefileCMake 工具,把所有的编译命令写在一个文件里,只需要敲一个 makebuild 命令,系统就会自动帮你把几百个文件全部编译成最终的可执行程序。

但是!工作的基础就是你现在练的。即使是 make,底层归根结底还是执行 gcc 命令。你现在亲手敲 gcc -o,就是在打底子,以后用自动化工具时才不会发懵,出了编译报错才能看得懂。

✅ 给你最核心的总结

以后写 C 语言,永远记住这 3 条命令

操作 命令 解释
1. 写代码 gedit hello.c 或 VSCode 编辑 编写源代码(施工图纸)
2. 编译 gcc hello.c -o hello 翻译成机器码(盖大楼)
3. 运行 ./hello 执行大楼(注意:不带 .c

只要跑通这 3 步,你的第一个程序就彻底成功了。以后你学到的所有复杂概念(多文件编译、静态库、动态库)都是基于第 2 步的扩展。放心,你现在练的就是最纯正的底层功底!