资讯动态

虚拟机和编译环境配置避坑:VirtualBox到齐次坐标常见故障排查

发布时间:2026/10/17 16:00:47 来源:尧图企业网站定制
简介Games101课程作业0的PDF是一份虚拟机使用指南面向选修计算机图形学与混合现实研讨会的学生旨在帮大家免去手动配置环境的麻烦。文档从Oracle VM VirtualBox安装讲起涵盖Windows、macOS、Linux不同系统的下载方式随后说明虚拟硬盘文件的获取与解压、新建虚拟机时的类型与内存设置以及Ubuntu系统密码。针对增强功能给出了图形菜单和命令行两种Guest Additions安装方法并介绍作业框架拖放传输、用Visual Studio Code编辑和在命令行编译运行的流程。此外还附有C常见错误指南与Eigen库使用提示有助于新手快速排错。文件为单个PDF大小仅874KB内容精炼。目前已有433人学习下载非常适合课程初学者按步骤搭好统一环境。1. 虚拟机能装的都装了为什么还是进不去系统初学图形学的同学很少被算法卡住多半是先被“作业 0”的环境配置折腾到怀疑人生。装 VirtualBox、下载虚拟硬盘、启动虚拟机、安装增强功能、拖入作业框架这一套流程里每一步都有自己的坑而且报错信息往往含义模糊——大写的 FATAL 提示、黑屏、拖放文件没反应、编译时一串 undefined reference。很多人把它归为玄学其实每一类现象背后都有确定的根因只是没人按“现象→根因→解决”的顺序带你走一遍。这篇就按我实际排查的顺序把整条链路里最常见的故障拆开写清楚新手照着做能一次走通熟手也能看明白每步为什么这样配置。2. 虚拟机起不来新建时报错与虚拟硬盘挂载的坑2.1 新建虚拟机时最容易翻车的一步没把 VDI 挂上去先说最常见的现象照着教程点完了新建向导点“启动”虚拟机一闪而过或卡在“FATAL: No bootable medium found”偶尔还会跳进类似 EFI Shell 的界面。很多人第一反应是重装 VirtualBox其实根因往往只有一个——新建向导最后一步虚拟硬盘区域默认是“创建虚拟硬盘”而不是“使用已有的虚拟硬盘文件”。于是 VirtualBox 给你造了一块空盘启动时找不到引导介质自然起不来。课程资源里交付的是一整块虚拟硬盘文件命名是 GAMES101_Ubuntu 18.04.2 (64bit).vdi它已经把 Ubuntu 18.04.2 系统和编译环境打包好了。你不需要从 ISO 镜像安装系统只需要让 VirtualBox 把这块盘当作虚拟机硬盘来启动。所以在新建向导里类型选 Linux版本选 Ubuntu (64-bit)内存按文档建议给 2048 MB走到“硬盘”这一步时选择“使用已有的虚拟硬盘文件”再点文件夹图标定位到你解压出来的 .vdi 文件后续直接创建即可。启动后登录密码是文档交付的 Ilovegraphics进入桌面就能看到预装好的开发工具。这里补一个常见误用如果你拿到的是 .rar 压缩包必须先解压出 .vdi再在向导里选择这个解压后的文件。选压缩包本身或选未解压完整文件都会导致加载失败表现同样是启动报错或黑屏。2.2 起不来时按顺序查这三处内存分配、VT-x、VDI 文件本身如果“使用已有的虚拟硬盘文件”这一步已经选对了启动仍然失败我一般按下面顺序排查而不是盲目重装。第一内存。文档建议 2GB但并不强制只要不低于 1GB 就有机会启动但 Ubuntu 桌面会很吃力表现为开机极慢或桌面卡死。如果你本机内存紧张可以给虚拟机 1536 MB 起步同时注意不要在虚拟机运行时把宿主机内存吃满。第二虚拟化加速。VirtualBox 默认启用硬件虚拟化如果报错里带“VT-x is not available”或类似的字样说明宿主机的 CPU 虚拟化没开。常见做法是进入 BIOS/UEFI 设置把 Intel VT-x 或 AMD-V 选项打开保存重启后再进 VirtualBox。这一步是很多新手完全没想到的坑因为教程里不会写只有报错弹窗里那一句英文。第三VDI 文件本身。检查你解压后的文件大小与压缩包解压完应有的体积是否一致如果你下载中断过文件尺寸不对虚拟机加载到一半就会报错或卡死。VirtualBox 对磁盘镜像文件的完整性非常敏感一个截断的 VDI 会表现出各种奇怪症状这里教一个快速判断办法放 VDI 的目录不要带有中文、空格和特殊符号部分版本的 VirtualBox 在中文路径上会加载失败表现为配置向导里能选中但启动即报错。把文件挪到一个纯英文路径比如 D:\vm\ 下再重新挂载一次很多“莫名其妙”的启动失败就消失了。提示遇到启动异常先看 VirtualBox 弹出的错误弹窗原文关键词决定方向。FATAL / No bootable medium 指向 VDI 未挂载VT-x / Hyper-V 字样指向 BIOS 虚拟化开关黑屏或卡日志则优先怀疑 VDI 文件损坏。3. 增强功能装不上拖放文件没反应、分辨率锁死的根因3.1 系统起来了但文件拖不进虚拟机先查 Guest Additions很多人进系统后的第一件事是把作业框架拖进虚拟机结果拖了没反应然后怀疑 VirtualBox 本身有问题。这里要先区分一个概念VirtualBox 本身是宿主机的程序而虚拟机里的 Ubuntu 是一个独立的操作系统。两者之间互相拖文件、共享剪贴板、自适应分辨率这些能力并不是系统自带的而是由 VirtualBox Guest Additions增强功能这套驱动提供的。系统自身不带它必须手动装这正是作业文档第一段就强调“需要手动安装 Guest Additions 来增强虚拟机功能”的原因。判断有没有装好最简单的方法就是看虚拟机窗口能否自动适应分辨率以及“设备”菜单里的“共享剪贴板”“拖放”选项是否可点。如果这些菜单是灰的或者调整窗口大小后 Ubuntu 桌面分辨率不变基本可以确定增强功能没生效。此时不要急着改分辨率配置文件先回到增强功能安装这一步。最常见的第一种情况是装了但没重启。增强功能的核心是内核模块和图形驱动不重启系统不会加载安装完成后会提示重启别忽略。第二种情况是安装过程中编译失败靠菜单“设备→安装增强功能”弹出来的光盘没有自动运行或者运行到一半报错很多人的反应是“再点一次”但根因通常是缺少编译依赖后面小节会展开讲命令方式。3.2 图形界面安装失败时用命令行把增强功能装完如果菜单安装方式失败文档给了一条命令行路径实际场景里我推荐直接记住这套命令它比图形界面更可控sudo mkdir -p /media/cdrom sudo mount -t auto /dev/cdrom /media/cdrom/ cd /media/cdrom/ sudo sh VBoxLinuxAdditions.run四条命令逐条说。mkdir -p /media/cdrom是创建挂载点目录-p的含义是“如果目录已存在也不报错”重复执行不会翻车。mount -t auto /dev/cdrom /media/cdrom/是把虚拟光驱挂载到/media/cdrom-t auto让系统自动探测文件系统类型因为 VBox 的增强功能光盘是 ISO 9660 格式也可以显式写成-t iso9660。cd进入挂载点后.run脚本就是增强功能的安装程序sudo sh以管理员权限执行它是必需的因为安装过程要往系统目录写入驱动文件。执行完最后一条命令后屏幕上会滚动很多编译和安装日志看到类似“Building the VirtualBox Guest Additions kernel modules”的过程说明正在编译内核模块。如果这一步报错最常见的错误是缺少内核头文件或 gcc、make 这类编译工具报错信息里一般会有location of failed或command not found等字样。处理方式是在虚拟机里执行sudo apt update sudo apt install build-essential linux-headers-$(uname -r)然后重新运行.run脚本。这一步要联网如果你的虚拟机没配网络先检查 VirtualBox 的“网络”设置里的“连接方式”是不是 NAT默认应该是。装完后reboot重启后拖放、共享剪贴板、自适应分辨率就会一起生效。注意部分系统里光盘设备名可能不是/dev/cdrom而是/dev/sr0。如果mount提示 No medium found先执行lsblk看一下设备列表找到 sr0 就把命令里的设备名替换成/dev/sr0再挂载一次。4. 编译不过去从编译错误到链接错误再到本题的齐次坐标4.1 main.cpp 报错时先分清楚是哪一类错误作业 0 的程序逻辑本身不复杂按模板要求的算法把点 P(2,1) 先绕原点逆时针旋转 45°再平移 (1,2)用齐次坐标算出变换后的点。但很多人的第一道坎不在数学而在编译阶段。建议先把文档里那一节“C 常见错误指南”背下来它把最常见的四类错误分得很清楚这决定了你查的方向。Compile Error 是编译错误编译器会明确告诉你哪个文件第几行什么符号有问题照着提示改即可undefined reference to xxx 是链接错误意思是代码里用到了某个函数或变量编译各阶段通过了但最终链接时找不到它的实现常见原因是 CMakeLists.txt 里少引了模块Segmentation Fault 是段错误程序运行到一半崩溃常见是数组越界或栈空间开太大Bus Error 成因与段错误类似Math Error 则是除数为 0 这类数值问题。很多人把 undefined reference 当成编译错误去改语法结果改了半天报错依旧就是没分清阶段。这里给一个实操判断法直接看终端里报错文本的颜色和位置。编译错误通常带文件名、行号、以及代码上下文而 undefined reference 通常出现在链接阶段报错文本以 .o 文件的引用位置为主指向某个未定义的符号。在作业 0 这个项目里如果你自己手写了 CMakeLists.txt或者改动了课程提供的模板最常遇到的就是链接错误下一小节展开讲。4.2 Eigen 头文件与 CMakeListsundefined reference 的排查顺序模板代码里引入 Eigen 的方式是#include eigen3/Eigen/Core注意不是Eigen/Core。Eigen 是一个头文件库header-only大多数功能不需要额外链接 .so 库所以如果你在 CMakeLists.txt 里看到target_link_libraries什么第三方库反而不是必须的关键是头文件搜索路径要能找到 eigen3 这个目录。如果一下查不到可以先用一个最简单的命令验证在 build 目录下执行cmake ..后留意终端输出里有没有“找不到 eigen3”之类的提示。undefined reference 的排查顺序我一般分三步。第一步确认 CMakeLists.txt 里的add_executable写对了例如add_executable(Transformation main.cpp)这样编译产物才是 Transformation后续./Transformation才能执行如果你改了文件名但没同步改 CMakeLists会得到“找不到可执行文件”或者运行旧版本的结果。第二步确认是否引用了其他库但作业 0 的模板通常不需要所以这一步直接跳过。第三步重新生成构建系统改完 CMakeLists.txt 后不要只运行 make因为 CMake 的缓存还在旧配置不会自动重建正确做法是先删掉 build 目录再用mkdir build cd build cmake ..重新生成。这是新手最容易踩的空子改一句 CMakeLists 然后 make报错依旧就以为代码有问题其实 CMakeCache 根本没更新。4.3 作业本身为什么要写 4×4 矩阵旋转怎么填数学部分也是要求“用齐次坐标进行计算”这句话有明确的语法含义。二维的平移用 2×2 矩阵无法表示因为平移不是线性变换需要对坐标补充一个恒为 1 的维度用 3×3 矩阵来表示而本课程后续所有作业都统一用 Eigen 的 Matrix4f 或 Matrix4d即 4×4 齐次矩阵所以作业 0 的计算建议直接写成 4×4。旋转 45° 的旋转矩阵是[[cos45, -sin45, 0, 0], [sin45, cos45, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]平移 (1,2) 的平移矩阵是[[1,0,0,1], [0,1,0,2], [0,0,1,0], [0,0,0,1]]。注意顺序题目要求“先旋转再平移”所以是 T * R * P先作用在点上的变换写在右边。用 Eigen 写时按列优先初始化矩阵要特别小心因为 Eigen 默认按列填充而大部分新手按行阅读矩阵会导致填错。模板里i 1.0, 2.0, ...这种逗号初始化是按行写入的但如果对每个元素单独赋值就需要注意 Eigen 索引是.coeff(r, c)还是括号下标。这里直接采用模板里i 逐行写法即可避免手写索引出错。验证输出时可以用模板里给的三角函数常识做快速自检sin(30°)写成sin(30.0/180.0*acos(-1))输出应该是 0.5。这个细节用来提醒你 C 与 Eigen 的三角函数都使用弧度制作业里旋转 45° 时cos(45°)一定要写cos(45.0/180.0*acos(-1))而不是cos(45)否则结果会完全不对。这个错误不报编译错误但输出数值差到离谱很多人还以为是用错了矩阵其实只是角度制单位没转。5. 作业 0 常见问题避坑五条容易反复踩的环境坑5.1 拖放已设为双向文件还是拖不进去现象按照文档把拖放改成双向重启了虚拟机从宿主机拖文件到 Ubuntu 桌面指针变成禁止符号。原因Guest Additions 没有真正生效最常见是安装时编译失败但你没注意看终端日志“设备”菜单里的剪贴板选项虽然可点但实际内核模块没加载。解决回到终端重新执行sudo sh VBoxLinuxAdditions.run盯着日志里有没有 error 字样如果有先装内核头文件和编译工具再重跑。装完后执行reboot拖入前再顺手把“设备→拖放→双向”确认一遍。5.2 命令行安装时提示 No medium found现象执行sudo mount -t auto /dev/cdrom /media/cdrom/时终端提示 No medium found甚至没有/dev/cdrom这个设备。原因VirtualBox 菜单中的“安装增强功能”没有真正挂载光盘或者光驱设备名不是/dev/cdrom。解决先点一次菜单“设备→安装增强功能”再执行lsblk查看设备列表若看到 sr0则改用sudo mount -t auto /dev/sr0 /media/cdrom/。若lsblk里根本没有光盘设备说明菜单挂载失败可尝试在“存储”设置里为一个空闲光驱控制器添加 VBoxGuestAdditions.iso 镜像再挂载。5.3 cmake .. 执行完一堆红色报错下一步不会动了现象在 build 目录里执行cmake ..输出大段错误看起来像“找不到某个文件”于是开始乱改 CMakeLists.txt。原因很多人以为 cmake 是一条命令其实它是一个配置阶段。报错里如果出现 Could not find 或 No such file先看路径而不是看 CMakeLists 内容常见原因是你在源码目录而不是 build 目录执行了cmake ..或者 build 目录里残留了上次失败的缓存文件。解决删掉 build 目录回到源码目录重新按mkdir build、cd build、cmake ..、make的顺序来。这四步的依赖关系是cmake 读取上一级目录的 CMakeLists.txt 生成构建脚本make 根据构建脚本编译出可执行文件。跳过或打乱任何一步都会得到莫名其妙的报错这是作业 0 环境里最值得记住的一条。5.4 编译成功但 ./Transformation 没有输出现象make 后执行./Transformation终端一片空白等待片刻也没有任何打印。原因可执行文件路径不对。make 的产物生成在 build 目录里如果你站在源码目录直接运行./Transformation系统找不到这个文件如果恰好源码目录里也有同名文件运行的是旧版本。解决执行ls build看看有没有 Transformation 文件如果没有说明 make 没成功或在别的目录有的话执行./build/Transformation或者cd build后再运行。检查输出时把打印语句放到 main 函数里、return 0之前不要放到可能被优化的位置。5.5 提交时打包错文件交上去的不是作业现象在课程指定的提交平台上传了压缩包但提交后自己重新下载解压发现没有 main.cpp 或没有打包 build 目录。原因提交要求的是“将编写好的程序打包”平台要求的格式以课程说明为准但很多人随手全选文件夹压缩把构建产物、缓存文件一并交了甚至把整个 .vdi 也压缩进去文件体积巨大且容易被判无效。解决提交前在虚拟机里只保留 main.cpp 和必要的源码文件打包前先在项目根目录执行make clean之类的清理若模板没提供就手动删掉 build 目录确认压缩包解压后能直接看到源码结构。这份作业不参与评分但流程会用于后续作业提交格式踩一次坑影响不大到下一次正式作业再翻车就亏了。6. 从一个报错快速定位到根因我的排查顺序被作业 0 反复折腾过后我总结出一套“先分类、再逐级验证”的定位方法遇到这类新环境配置问题都用它效率高不少。第一步把问题归入三层系统启动层能否进入 Ubuntu 桌面、功能增强层拖放、剪贴板、分辨率、代码编译层cmake、make、运行结果。大多数疑难杂症都可以落到其中某一层两层并发的问题先解决前一层。下表是判断入口现象先查一项对应根因启动报错 FATAL新建向导里是否选了已有 VDI空盘启动启动报错 VT-xBIOS 虚拟化开关宿主机未开启硬件加速系统起来了但拖放无效Guest Additions 是否重装并重启增强功能未加载文件拖进去了但编译报错编译错误还是链接错误CMakeLists 或依赖缺失程序能跑但输出对不上角度制和弧度制三角函数单位错误第二步看报错文本里的第一个关键词通常已经给了方向不要被后面的几十行日志干扰。VirtualBox 的启动层报错集中在头几行编译报错集中在error:这个 token 附近链接错误集中在undefined reference附近。看第一个关键行比读完整日志省三倍时间。第三步做小步验证。判断增强功能是否生效只调整一次窗口大小看分辨率判断编译链路是否通了先编译模板自带的原始例子再看自己改动的代码判断程序输出对错把中间结果逐步打印出来比如先打印旋转后、平移前的坐标再打印最终坐标这样能立刻区分是矩阵算错还是单位制错误。从那以后每次有新环境或新作业模板我都强制走一遍“启动层—增强层—编译层”的顺序不在某一层钻牛角尖。这个习惯确实省了不少后悔药的费用希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑