VS Code 多文件项目编译链接

发布时间:2026/6/28 5:38:04
VS Code 多文件项目编译链接 VS Code 多文件项目编译链接前言这篇文章源于我 C 课程大一的大作业——基于 EasyX 图形库的推箱子游戏。这个项目遵循面向对象的思想使用 EasyX 库进行可视化渲染已上传到我的 github 仓库链接在下方。虽然这个项目还是很简陋的但作为一个多文件项目它在 VS Code 中的编译最开始让我很茫然一直搞不清tasks.json文件里面写的路径和编译指令。这篇笔记就是记录了我研究其编译方法的全过程并整理了一些相关知识希望能给有类似疑问的朋友们一些参考。Sokoban项目仓库最初问题最初tasks.json文件中使用的全部是绝对路径因为使用相对路径老是编译错误当时临近期末急着完成项目就先无脑使用绝对路径了。解决过程理解文件路径将编译器名称前的绝对路径删除改为command: g.exeg.exe已经加入了系统环境变量直接使用其名称命令行会到环境变量Path中找g.exe的路径。将几个.cpp文件放进src/文件夹将args:中的参数改为src/*.cpp只不过在 win11 的 cmd 中好像不支持这样的通配符使用就改为一个个罗列了。链接出的目标文件即-o参数后的Sokoban.exe文件没有加路径默认放在当前工作目录即后面的cwd(Current Wording Directory)。接着将所有.h头文件放到include/文件夹下。这时就要加上链接用到的参数-I,后面带上include这个目录名。在编译预处理阶段预处理器会根据各个.cpp文件开头处的#include预处理指令前往include/文件夹下找到各个头文件并将其代码原封不动地粘贴到.cpp文件中。各个头文件开头的#pragma once保证了各个头文件只会被包含一次防止重复声明。args:中最后的几个-l开头的参数是链接库。对于目前阶段的程序运行只要知道底层需要依赖这些东西即可不必深究。将cwd的值由${fileDirname}改为${workspaceFolder}。${fileDirname}代表当前打开文件所在的文件夹而${workspaceFolder}代表 VS Code 中打开的文件夹。如果不改在不同的文件中按CtrlShiftB对应的文件夹就不同会导致编译失败。比如如果直接在tasks.json文件夹中操作cwd就是.vscode文件夹前面所有的src/*.cpp和include/*.h就都找不到。而改为${workspaceFolder}后无论编辑哪个文件编译都以项目根目录为准所有相对路径都能正确解析。拓展延伸理解编译指令按CtrlShiftB后其实是 VS Code 在自动执行tasks.json中的配置。所以直接在 cmd 命令行手动输入相应指令也是完全一样的。command: g.exe,调用g的指令。args中的内容含义值意义-fdiagnostics-coloralways编译报错颜色-g生成调试信息src/*.cpp目录/源文件这里的*只是省略写法实际是要全列出来的-o指定编译链接出的目标文件路径和文件名Sokoban.exe或build/Sokoban.exe编译链接出的目标文件路径和文件名-I指定包含头文件的路径include需要包含的头文件的路径-leasyx链接 EasyX 图形库-lgdi32和-lole32链接 Windows 系统底层图形和 COM 组件库EasyX 的依赖以上命令等价于在项目根目录中命令行输入g src/main.cpp src/Map.cpp src/Player.cpp src/LevelManager.cpp src/GameEngine.cpp -o build/Sokoban.exe -I include -leasyx -lgdi32 -lole32这里省去了报错颜色和调试信息的内容因为它们不影响最终可执行程序的生成。 值得注意的是经过实际操作发现这段代码中/和\是可以混用的因为 g 编译器都可以识别但是后面通过命令行运行生成的可执行文件时文件路径中必须使用\因为这是在给 cmd 发指令它只认识反斜杠。后续运行时如果直接在build/文件夹下找Sokoban.exe并双击运行是无法正常运行的因为此时工作目录是build\而非Sokoban\build\而Sokoban.exe在运行时会到当前工作目录下去找外部依赖文件levels.txt加载地图用的那么运行后就会发现无法加载地图因为找不到levels.txt。此时有三种解决方法直接复制一份levels.txt到build\中简单粗暴。把LevelManager.cpp中加载levels.txt的路径由levels.txt换成../level.txt。每次运行Sokoban.exe时确保当前工作目录是Sokoban\而非Sokoban\build\这样就只能在命令行中运行而不能靠鼠标点击运行。每次运行时在Sokoban\下输入build\Sokoban.exe即可这样工作目录就是Sokoban\。 注意这里必须使用\如前所述它是给命令行的命令。当前采用的是第二种方法。结语希望这份笔记能给你一定的帮助如果你喜欢记得点个赞。这是我的第一篇博客以后也会持续更新。作者水平有限欢迎交流和指正也欢迎到我的 github 仓库参观。Lchao2026.6.27