Games101作业0环境搭建全攻略:从虚拟机到CMake与Eigen配置
发布时间:2026/9/27 4:38:10 锦皓数字建站

简介这份PDF是GAMES101课程作业0的官方说明文档面向正在学习计算机图形学、需要搭建统一开发环境的学生与自学者。内容围绕虚拟机使用展开涵盖VirtualBox安装、虚拟硬盘配置、Guest Additions增强功能安装、作业框架传输与编辑以及VSCode开发工具和C语法注意事项帮助读者免去手动配置环境的麻烦快速进入作业编写与调试环节。资源包共1个PDF文件大小约874KB篇幅紧凑适合作为环境搭建与作业入门的操作参考。目前已有433人学习下载。通过这份文档读者可以掌握从零搭建Ubuntu虚拟机的完整流程理解拖放传输、命令行编译运行等关键操作并借助C常见错误指南与Eigen库说明为后续图形学作业打下扎实的环境与语言基础。1. 从 Games101 作业 0 说起为什么一个「配环境」的 PDF 值得单独写一篇很多人第一次打开 Games101 作业 0 的 PDF心里是有点不屑的不就是装个虚拟机、配个 C 环境、跑个 Eigen 吗能有多难。结果真上手卡住的地方往往不是图形学而是 CMake 报错、Eigen 找不到、VS Code 底部状态栏那个 Configure 按钮到底该不该点。作业 0 的 PDF 本质是一份环境搭建说明书它要你在一台干净的机器上把 C 工具链、CMake、Eigen 和编辑器串成一条能编译能运行的链路。这件事对新手是门槛对熟手是肌肉记忆但恰恰是这条链路决定了你后面十几个作业能不能顺利跑起来。这篇不聊光栅化也不聊光线追踪只把作业 0 背后的环境工程拆开讲清楚每一步在干什么、参数怎么设、报错怎么读、哪些坑我踩过。适合刚拿到 PDF 还没动手的人也适合配到一半卡住想找后悔药的人。2. 作业 0 到底要你搭什么工具链拆解与选型理由2.1 虚拟机、WSL 还是原生系统三条路怎么选作业 0 的 PDF 通常建议在 Linux 环境下做原因很实际后续作业会用到 OpenCV、Eigen 这些库Linux 下的包管理和编译链路最顺助教和网上的参考资料也大多基于 Ubuntu。于是问题变成Linux 环境怎么来。常见做法有三种我按自己的使用顺序说。第一种是 VMware 或 VirtualBox 装 Ubuntu 虚拟机。优点是隔离干净装崩了直接删掉重来对新手最友好也是热搜里「vmware 虚拟机安装教程」被反复搜的原因。缺点是吃内存编译大项目时慢图形界面偶尔黑屏进不去桌面。第二种是 Windows 自带的 WSL2装 Ubuntu 子系统性能接近原生文件互通方便缺点是图形界面和 OpenGL 相关的东西配置起来比虚拟机麻烦后面做渲染作业可能遇到显示问题。第三种是直接装双系统或纯 Linux性能最好但装系统本身对新手就是一道坎装坏了影响日常使用。我的建议很直接第一次做 Games101用虚拟机装 Ubuntu别折腾。等你把作业 0 到作业 2 跑通了再考虑换 WSL 或原生。选型不是比谁高级是比谁让你最快进入写代码的状态。2.2 编译器、CMake、Eigen 各自负责什么把工具链拆开看每个角色都很清楚。编译器g 或 clang负责把 C 源码翻译成可执行文件这是最底层的一环。CMake 是构建系统生成器它读 CMakeLists.txt生成 Makefile 或 Ninja 文件再由 make 去调用编译器。很多人分不清 makefile 和 cmake 的区别一句话makefile 是给 make 用的构建脚本cmake 是生成这些脚本的工具跨平台能力更强作业 0 用的就是 CMake。Eigen 是纯头文件的线性代数库矩阵、向量、变换都靠它图形学里到处是向量和矩阵运算所以作业 0 让你先把它配好。注意 Eigen 不需要编译安装它是一堆 .h 文件只要让编译器能找到头文件路径就行这也是后面 CMake 里 find_package 或 include_directories 要处理的事。组件作用作业 0 里的角色g / clang编译 C 源码最终把 .cpp 变成可执行文件CMake生成构建文件读 CMakeLists.txt产出 Makefilemake执行构建按 Makefile 调用编译器Eigen线性代数库提供 Matrix、Vector 等类型VS Code编辑器写代码、点 Configure、看报错2.3 为什么作业 0 要你先跑通一个最小程序作业 0 的 PDF 一般会让你编译一个最简单的程序可能只是打印一句话或者做个矩阵乘法。这不是走过场是在验证整条链路CMake 能不能找到编译器、能不能找到 Eigen、生成的 Makefile 能不能跑、可执行文件能不能运行。任何一环断了你都会在后面的作业里以更隐蔽的方式再遇到。所以作业 0 的价值不在代码本身在于它把环境问题提前暴露出来。跑通它等于给自己买了一份后悔药。3. 在 Ubuntu 虚拟机上把环境配到能编译命令与参数3.1 装完 Ubuntu 后先做这几件事虚拟机装好 Ubuntu 之后别急着开 VS Code。先打开终端把系统更新和基础工具装上。这一步能避免后面一堆「找不到命令」的报错。# 更新软件源索引确保装到的是较新版本 sudo apt update # 升级已安装的包第一次装完系统建议做一次 sudo apt upgrade -y # 安装编译工具链、CMake、Git 和 Eigen sudo apt install -y build-essential cmake git libeigen3-devbuild-essential 里包含了 g、make 这些核心工具cmake 是构建工具libeigen3-dev 是 Ubuntu 仓库里的 Eigen 包。装完之后用下面几条命令验证每条都要有输出没输出就是没装好。g --version # 看编译器版本 cmake --version # 看 CMake 版本 ls /usr/include/eigen3 # 看 Eigen 头文件在不在Eigen 装在 /usr/include/eigen3 这个路径下记住它后面 CMake 找不到 Eigen 时大概率是路径没配对。如果 ls 报「没有那个文件或目录」说明 libeigen3-dev 没装上回去看 apt 的报错信息。3.2 用 CMake 跑通第一个最小工程在 home 目录下建一个练习文件夹写两个文件CMakeLists.txt 和 main.cpp。这是作业 0 最核心的一步也是后面所有作业的模板。# CMakeLists.txt cmake_minimum_required(VERSION 3.10) # 最低版本要求Ubuntu 自带的通常够 project(Games101_HW0) # 工程名随便起 set(CMAKE_CXX_STANDARD 17) # 用 C17作业里常用 set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Eigen3 REQUIRED) # 找 Eigen找不到会直接报错 include_directories(${EIGEN3_INCLUDE_DIR}) # 把头文件路径加进来 add_executable(main main.cpp) # 生成可执行文件 main// main.cpp #include iostream #include Eigen/Dense // Eigen 的核心头文件 int main() { Eigen::Matrix2f m; // 定义一个 2x2 的 float 矩阵 m 1, 2, 3, 4; std::cout matrix:\n m std::endl; std::cout determinant: m.determinant() std::endl; return 0; }CMakeLists.txt 的逻辑是声明版本、设 C 标准、找 Eigen、加头文件路径、生成可执行文件。find_package(Eigen3 REQUIRED) 里的 REQUIRED 表示找不到就报错停止这是好事能让你第一时间发现问题而不是编译到一半才炸。main.cpp 里用 Eigen::Matrix2f 定义矩阵determinant() 算行列式能打印出结果就说明 Eigen 真的被链接上了。编译运行mkdir build cd build # 建一个 build 目录保持源码目录干净 cmake .. # 生成构建文件.. 指向上一级的 CMakeLists.txt make # 执行编译 ./main # 运行mkdir build cd build 这个习惯要养成CMake 官方推荐 out-of-source 构建所有中间文件都在 build 里删掉 build 就等于清理干净不会污染源码目录。cmake .. 里的两个点表示 CMakeLists.txt 在上一级目录。如果 cmake .. 报错先看它说的找不到什么再对症下药。3.3 VS Code 里那个 Configure 按钮到底该不该点热搜里有人问「vscode 安装 cmake tools 底部状态栏应该有 configure 按钮吗」答案是装了 CMake Tools 扩展并且打开了一个含 CMakeLists.txt 的文件夹底部状态栏就会出现 Configure。点它等价于在终端敲 cmake只是把命令图形化了。点之前要确保已经选好编译器套件Kit否则它会让你先选一个。我一般的工作流是终端里手动 cmake .. make 跑通一次确认环境没问题再用 VS Code 的按钮。这样出问题时你能分清是环境问题还是编辑器配置问题。VS Code 的 CMake Tools 有时会缓存旧的配置改了 CMakeLists.txt 后按钮行为不对可以按 CtrlShiftP 找「CMake: Delete Cache and Reconfigure」清掉重来。这个缓存问题坑过不少人报错信息看着莫名其妙其实清一下就好。4. 编译报错怎么读从 CMake 输出定位真实问题4.1 报错信息的分层结构CMake 的报错看着吓人其实有结构。最上面通常是「CMake Error at ...」告诉你哪个文件哪一行出错接着是具体描述最后是「Configuring incomplete, errors occurred」。读报错先读第一行的文件路径和行号再看描述里的关键词比如 Could NOT find Eigen3、No CMAKE_CXX_COMPILER could be found。关键词决定了你该去查什么。编译阶段的报错来自 g格式是「文件:行:列: error: 描述」。这类报错通常是语法问题、头文件没包含、类型不匹配。Eigen 的报错尤其长模板展开后能刷屏这时候看最上面第一个 error 就行后面的往往是连锁反应。4.2 三类高频报错的处理路径第一类找不到 Eigen。现象是 CMake 报 Could NOT find Eigen3。原因通常是 libeigen3-dev 没装或者装了但 CMake 的查找路径不对。解决先确认 /usr/include/eigen3 存在如果存在还报错在 CMakeLists.txt 里手动指定 include_directories(/usr/include/eigen3)。第二类找不到编译器。现象是 No CMAKE_CXX_COMPILER could be found。原因多半是 build-essential 没装全或者你在一个没装编译器的环境里跑。解决sudo apt install build-essential然后删掉 build 目录重新 cmake。第三类C 标准不匹配。现象是编译时报一堆 Eigen 内部的语法错误或者提示需要 C11 以上。原因是你没设 CMAKE_CXX_STANDARD编译器默认用了老标准。解决在 CMakeLists.txt 里加上 set(CMAKE_CXX_STANDARD 17)。4.3 用最小复现缩小问题范围环境问题最怕的是「不知道哪一环坏了」。我的做法是准备一个最小工程就是 3.2 里那套 CMakeLists.txt 加 main.cpp任何环境改动后先跑它。如果最小工程能过说明工具链没问题问题在你新加的代码或配置里如果最小工程都过不了说明是环境本身的问题别在业务代码里找原因。这个习惯能省掉大量瞎猜的时间。5. 避坑与排查作业 0 里最容易翻车的五件事5.1 虚拟机装完黑屏进不去桌面现象VMware 里 Ubuntu 装完重启卡在黑屏或者只有光标。原因通常是显卡驱动或显示配置和虚拟机不兼容也可能是安装时选了 3D 加速但宿主机不支持。解决关机后在虚拟机设置里关掉「加速 3D 图形」把显存调大一点再启动。如果还不行启动时进 GRUB 选 recovery 模式用 nomodeset 参数进系统再装驱动。5.2 外面的命令复制不进虚拟机终端现象在宿主机复制了一条命令到虚拟机终端里 CtrlV 没反应。原因是虚拟机默认没装或没开剪贴板共享。解决VMware 里装 open-vm-tools 和 open-vm-tools-desktop然后重启。命令是 sudo apt install -y open-vm-tools open-vm-tools-desktop。装完宿主机和虚拟机之间就能复制粘贴了这个对新手体验影响很大。5.3 CMake 缓存导致的玄学报错现象改了 CMakeLists.txt重新 cmake 还是报旧错误或者行为跟改之前一样。原因是 build 目录里缓存了上次的配置。解决删掉整个 build 目录重新来rm -rf build mkdir build cd build cmake ..。VS Code 里就用前面说的 Delete Cache and Reconfigure。这个坑的特点是报错信息和你改的东西对不上遇到对不上的报错先怀疑缓存。5.4 Eigen 头文件路径写错现象编译时报 fatal error: Eigen/Dense: No such file or directory。原因是 include 路径不对。Eigen 装在 /usr/include/eigen3所以代码里写 #include Eigen/Dense而 CMake 里要把 /usr/include/eigen3 加进 include 路径。如果你手动写 include_directories(/usr/include)那代码里就得写 #include eigen3/Eigen/Dense。两种写法对应两种路径别混。用 find_package(Eigen3) 加 EIGEN3_INCLUDE_DIR 是最省事的。5.5 内存不够导致编译被 kill现象编译到一半进程突然消失终端只显示 Killed。原因是虚拟机内存给小了编译大文件时内存不够被系统杀掉。解决把虚拟机内存调到 4GB 以上编译时关掉浏览器等吃内存的程序。如果还是不够用 make -j2 限制并行编译数量减少同时占用的内存。6. 把作业 0 的环境变成可复用的模板配好一次环境之后别让它只服务作业 0。我的习惯是把 CMakeLists.txt 整理成一个模板后面每个作业复制过去改工程名和源文件就行。模板里固定这几样C17 标准、find_package(Eigen3)、include_directories、add_executable。这样每次开新作业环境部分零思考直接写业务代码。再进一步可以写一个 build.sh 把编译命令固化下来#!/bin/bash # build.sh一键清理并重新编译 set -e # 任何一步失败就停止避免带着错误继续 rm -rf build # 清掉旧构建避免缓存问题 mkdir build cd build cmake .. # 生成构建文件 make -j$(nproc) # 用所有核心并行编译加快速度set -e 是关键它让脚本在 cmake 失败时立刻停下不会继续跑 make 然后给你一堆误导性的报错。make -j$(nproc) 用满 CPU 核心编译快很多但内存小的机器要慎用可以改成 make -j2。验证环境是否真的没问题我一般跑三个检查g --version 有输出、cmake --version 有输出、最小工程能编译并打印矩阵行列式。三个都过这个环境就能支撑后面所有作业。如果哪天作业编译突然报奇怪的错先回到这三个检查大概率能定位到是环境被改动了还是代码本身的问题。说个我自己的教训第一次做 Games101 时我在 Windows 上直接装了 VS 和 CMake折腾了两天才发现 Eigen 的路径怎么都配不对最后换成 Ubuntu 虚拟机半小时就跑通了。环境这件事选对路比努力重要。后来我养成了一个习惯每换一台机器先花二十分钟把最小工程跑通再开始做正事。这个习惯帮我省下的时间远比这二十分钟多。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。