一个 C++ 工程文件夹里有四种角色:.dev 工程文件(记账本,记录本工程有哪些源文件、用什么编译选项)、.cpp 源文件(正文,你写的代码)、.o 中间产物(编译器翻译出的半成品机器码片段)、.exe 可执行程序(链接后的成品,双击就能跑);外加一个 Makefile.win(给编译器看的"施工图")。命根子是 .cpp 和 .dev——.o/.exe 删了能重新生成,.dev 删了工程就打不开了。
一、四种角色一目了然
| 文件 | 谁生成 | 作用 | 能不能删 |
|---|---|---|---|
.dev |
新建工程时 Dev-C++ 生成 | 记录工程包含哪些文件、编译选项、输出名 | 不能删(删了工程结构就丢了) |
.cpp |
你写 | 代码正文 | 不能删(删了代码就没了) |
.o |
编译时由编译器生成 | 单个源文件编译出的机器码片段,还没拼装 | 可以删(重编就有) |
.exe |
编译+链接后生成 | 最终程序,双击能运行 | 可以删(重编就有) |
Makefile.win |
Dev-C++ 生成 | 记录"先编哪个、后链哪个、用什么参数" | 可以删(会自动重建) |
记忆锚:.cpp 是菜谱,.o 是切好的备料,.exe 是端上桌的菜,.dev 是点菜单。
二、从源码到成品:两步走
- 编译(Compile)——把每个
.cpp单独翻译成.o。这一步只管"这个文件语法对不对" - 链接(Link)——把所有
.o加上需要的库拼成一个.exe
为什么分开:一个工程可能有 20 个 .cpp,改其中 1 个只需重编那 1 个(省时间);这也是 1.1.3 说"改一行要重编译"能被缓解的原因——编译是按文件算的。
新手最常踩的坑来自这一步:报错信息里出现 undefined reference to ...(链接错误),意思是"某个函数你用了,但没人提供它的实现"——先把文件都加进工程(第三节)再看。
三、多文件工程:为什么需要 .dev
单文件练习时,.dev 看着多余。但一旦程序分成多个源文件(比如 main.cpp 调用 tools.cpp 里的函数):
- 没有工程:Dev-C++ 只编你打开的那一个文件,链接时找不到
tools.cpp里的实现 → 链接错误 - 有工程:
.dev里登记了两个文件,编译器按它依次编译再链接 → 一次通过
动手习惯:以后每个练习都建工程(File → New → Project,选 Console Application → C++),而不是只建源文件——将来文件变多不会返工。
四、动手 Demo:看清自己的工程目录
第一步:在 Dev-C++ 里 File → New → Project,选 Console Application、语言选 C++,工程名写 hello,保存到 D:\cpp\hello(纯英文路径)。看到什么算成功:左侧工程面板出现树状结构(工程名 + main.cpp),编辑区自动打开一份带 main() 的模板代码。
第二步:按 F11 编译,然后到资源管理器看目录:
Get-ChildItem "D:\cpp\hello" | Select-Object Name, Length, LastWriteTime
看到什么算成功:列出 hello.dev、main.cpp(可能含 Makefile.win)。编译之后再看一次,会多出 hello.exe(可能还有 .o)——这就是"源码 → 成品"的实物证据。
第三步(实验):把 hello.exe 剪切到桌面,双击运行——看到什么:程序照样跑。结论:.exe 是独立成品;但双击 hello.cpp 只会打开记事本,因为源码不能"直接运行",必须经编译器(1.1 的"编译型"在这里落地)。
30 秒实验:把工程文件夹整个复制一份改名 hello_bak,双击里面的 .dev 能正常打开——这就是"备份工程"的正确姿势:拷文件夹(含 .dev 和 .cpp),而不是只拷 .exe。
五、常见误区
- "只留 exe 就行,源码不重要"——
.exe是成品,但改需求就得回到源码;源码+工程文件才是资产(这条规律放大到软件公司也一样) - "双击 cpp 文件就能运行"——不会。
.cpp是纯文本,必须有编译器翻译(这也解释了为什么"没装编译器就写不了 C++") - "多文件工程是高手才用的"——是组织代码的基本功;从第一个练习就用工程模式,后面省心
- "报错都是语法错"——分两类:
编译错误(语法/拼写,指出行号)和链接错误(找不到实现,检查文件是否加入工程);先分清哪一类,再动手改
自测三问(点开对答案)
1. 工程文件夹的四种主要文件?——`.dev`(记账本)、`.cpp`(正文)、`.o`(中间产物)、`.exe`(成品);另有 `Makefile.win`(施工图)。 2. 编译和链接分别做什么?——编译=每个 `.cpp` 单独翻译成 `.o`(只查本文件语法);链接=把 `.o` 与库拼成 `.exe`。链接错误常因文件没加入工程。 3. 哪些文件不能删?——`.cpp` 与 `.dev`(代码与工程结构);`.o`/`.exe`/`Makefile.win` 可重新生成。相关笔记
- C++代码结构 —— 工程视角的由来
- 认识Dev-C++ —— 工程面板列的就是
.dev里登记的文件 - 使用Dev-C++创建C++文件 —— 单文件练习与工程模式的区别