很多刚学C++的朋友都会遇到同一个尴尬:书买好了,代码敲了两页,结果连编译器都没有。Windows上虽然能装Visual Studio,但很多C++的底层知识点——编译链接过程、Makefile、GCC命令行、系统调用——和Linux的关系太紧密了。绕不开,就得在Linux下练。可一听说要装双系统,不少人就犹豫了:怕把现有系统搞坏、怕驱动出问题、怕来回重启耽误事。所以我一直推荐身边的朋友先用VMware虚拟机跑一个Linux系统。这篇文章就是《在VMware虚拟机中搭建C++开发环境》系列的第一篇,先把CentOS和Ubuntu这两个主流发行版从下载到安装完整走一遍,让你手上先有一台能用的Linux虚拟机。装好之后,下一篇我们再集中搞定GCC、GDB、CMake、VS Code这些C++开发工具链。
1. 先想清楚:为什么是VMware虚拟机,而不是双系统或WSL
我在指导朋友入门C++的时候,第一个问题经常是:“我为什么非得用虚拟机?用WSL不也能练Linux命令吗?”这个问题得好,因为WSL确实能用,但它和“真实的Linux环境”之间还有一段距离,尤其是做C++开发时,有些差距会很影响学习效果。
1.1 三种方案对比:双系统、WSL、VMware
先把三种常见路线摊开来说。
双系统就是笔记本上同时装Windows和Linux,开机时自己选进哪个。好处是性能完全不受损失,硬件资源全部给到当前系统;缺点是切换系统必须重启,而且分区操作对新手有风险,一不留神就可能把引导搞坏。
WSL(Windows Subsystem for Linux)是Windows自带的一个Linux兼容层,微软官方维护。它在Windows里跑一个Linux用户态环境,不需要虚拟机硬件层,启动就是几秒钟的事,开个终端就能敲Linux命令,非常方便。
VMware虚拟机则是真正在一个软件里完整模拟出一台电脑的硬件环境(CPU、内存、硬盘、网卡都是在虚拟层模拟出来的),在这台“虚拟电脑”里装一个完整的Linux系统。它和宿主机互不影响,系统坏了随时删掉重装,磁盘和内存是动态划分的,随时可以扩展。
三者比较起来,看这样一张表就明白了:
| 对比项 | 双系统 | WSL | VMware虚拟机 |
|---|---|---|---|
| 性能 | 最高,接近物理机 | 中等,但日常够用 | 略低于物理机,开发足够 |
| 系统隔离性 | 差,分区操作有风险 | 中,共享Windows文件系统 | 最强,独立虚拟硬盘 |
| 切换成本 | 每次重启切换 | 秒级切换 | 从打开到登录1-2分钟 |
| 是否影响宿主机 | 有风险(引导、分区) | 无 | 无 |
| 适合C++学习 | 适合但风险高 | 能跑但偏“阉割感” | 最适合新手和教学 |
1.2 为什么C++入门阶段特别适合VMware
C++这门语言的特殊之处在于,它和底层的关系特别近。你写了一个小项目,用GCC命令手动敲出.o文件,再用-o链接成可执行文件,这个过程中你能亲眼看到编译、汇编、链接每一步发生了什么。WSL也能做到这一点,但它并不是完完整整的Linux内核——它的文件系统、启动流程、网络栈都和原生Linux有差异。真到了写网络编程、多线程、调试系统调用参数的时候,WSL经常会在一些隐秘的地方表现得“不太对劲”,然后你就得花时间排查环境问题而不是代码问题。
VMware里的Linux则是一台完整的、和服务器完全一致的操作系统。你在里面写的代码,拿到一台真正的云服务器上几乎可以无缝跨过去;你踩过的坑、用过的命令、习惯的环境,全部是可迁移的真实经验。
还有一个对新手特别重要的点:虚拟机快照功能。装完系统之后拍一张快照,之后就算你gcc、cmake、环境变量弄得稀巴烂,一句话就能恢复到安装完的状态,这可比双系统重装省心太多。
2. 准备工作:VMware工具安装、BIOS虚拟化与镜像获取
在真正创建虚拟机之前,有三件事值得提前确认好,不然创建过程做到一半才发现环境不满足要求,会很耽误时间。
2.1 VMware Workstation的安装与版本选择
目前VMware Workstation分两个大版本:Windows下用的Workstation Pro,以及macOS下用的Fusion。如果你是在Windows上折腾,下载一个Workstation Pro即可。安装过程基本就是一路Next,需要注意装到“自定义安装路径”时,尽量选择非C盘目录,因为虚拟机的虚拟磁盘文件动辄几十GB,全堆在C盘很容易爆盘。
装完之后启动软件,确认一下“帮助 -> 关于”里的许可证状态。VMware虽然可以试用,但我建议有条件就注册一个个人使用授权,避免试用期过期后虚拟机无法启动。另外,每次新版本发布时不要急着第一时间升级,等个一两周再升,因为新版偶尔会踩到一些和当前镜像兼容性的小问题。
2.2 确认CPU虚拟化已经开启
这是很多新手最容易忽略的一步。VMware属于Type-2虚拟机(寄居在宿主操作系统之上的虚拟机软件),它需要CPU硬件虚拟化技术的支持。大多数现代CPU(Intel的VT-x和AMD的AMD-V)默认是开启的,但也有不少笔记本(尤其是品牌机)出场时BIOS里把这个功能关了。
判断方法很简单:打开任务管理器 -> 性能标签页,看右下角“虚拟化”状态。如果显示“已启用”,可以直接往下走;如果显示“已禁用”,需要重启电脑进BIOS(开机反复按F2、Del或F10,不同品牌略有区别),在CPU Configuration或者Security选项里找“Intel Virtualization Technology”或“AMD SVM Mode”,改成Enabled保存退出。
注意,这个步骤不做好,后面创建虚拟机时会直接报“此主机支持Intel VT-x,但Intel VT-x处于禁用状态”之类的错误,根本进不了安装界面。
2.3 镜像选择与下载:每个发行版的版本策略
镜像就是Linux系统的安装文件,相当于Windows安装盘里的.iso文件。下载渠道方面,首选各发行版的官方网站,然后根据自己网络情况选一个国内镜像站点,速度差距会非常明显。
Ubuntu的版本策略
Ubuntu每年4月和10月发布新版本,但LTS(Long Term Support,长期支持版)只出现在偶数年份的4月版本,比如22.04、24.04。LTS版本有五年支持周期,普通版本只有九个月。C++开发环境配置一次能用很久,强烈建议只下LTS版。本文以22.04 LTS为例,后续操作在24.04 LTS上也通用。拿镜像时,服务器版(Server)和桌面版(Desktop)的区别在本文后面会细说,先记住:初学者选桌面版即可。
CentOS的版本现状
CentOS是红帽系里的经典发行版,特点是稳定、保守。官方目前把CentOS Linux 7停止维护了,CentOS Linux 8也到期了,当前主线是CentOS Stream。看完这个现状,给新人的建议是:如果你是想跟着教科书(很多经典Linux教程都是以CentOS 7为蓝本写的),CentOS 7依然可以下载使用;如果你想学目前社区活跃度的方向,就直接用CentOS Stream 9,因为它和RHEL 9的演进路径是一致的,软件包策略也更现代化。本文两个版本都会提到,默认操作以CentOS Stream 9为例,同时标注CentOS 7的差异。
下载镜像时,进入官网后选择“Download”,通常会有“DVD ISO”和“Minimal ISO”。C++开发环境建议选DVD版本,它自带大量开发工具包(包括GCC),安装完成后不用联网就能编译代码;Minimal版本则只是一个最基础的系统,很多工具都要后期手动装,对新手不太友好。
3. 最关键的一步:正确创建VMware虚拟机
镜像下载好之后,打开VMware Workstation,开始创建虚拟机。这一步别急着回车,每一步都值得花点心思选对参数,因为后面再改虽然也能改,但磁盘和部分硬件设置改动起来比较麻烦。
3.1 新建虚拟机向导与安装源选择
点击“创建新的虚拟机”,选择“典型(推荐)”即可。到“安装程序光盘映像文件”这一步,把刚才下载的.iso挂载进去。这里要注意一个常踩的坑:如果你选了“稍后安装操作系统”,后续还得手动挂镜像,而且某些版本的VMware不会自动添加启动支持,反而多了一步没用操作,不如直接在这步就挂好。
VMware会自动识别ISO里的系统类型,但偶尔也会识别错。在“客户机操作系统”页面务必手动确认一下,比如明明是Ubuntu却显示成了“Red Hat Enterprise Linux”,这种情况我遇到过不止一次,识别错会导致后续的兼容性配置不对。
3.2 虚拟机硬件配置:内存、CPU与磁盘分配
这一步是很多人容易拍脑袋乱配的地方。我的建议是给出一套“保证够用、不浪费宿主资源”的基线配置:
| 配置项 | 建议值 | 说明 |
|---|---|---|
| 内存 | 4GB及以上 | C++编译器(GCC)在编译大型项目时内存非常吃紧,低于2GB会频繁swap |
| 处理器 | 2核 | 多于2核让编译并行度更高,但不要让虚拟机占满所有核心 |
| 磁盘 | 40GB(Ubuntu)/ 50GB(CentOS) | 系统本身+开发工具包就会占掉10GB左右,留出余量给未来代码和缓存 |
| 网络 | NAT模式 | 默认推荐,虚拟机可通过宿主机上网,但主机访问不到虚拟机内部服务 |
内存这里多说一句:如果你宿主机的内存只有8GB,虚拟机分4GB其实有点勉强,建议至少16GB物理内存再分4GB给虚拟机。如果实在紧张,就分2GB,但编译稍大一点的项目会明显变慢。磁盘磁盘格式保持默认的“将虚拟磁盘拆分成多个文件”就好,方便以后移动和备份。
3.3 网卡模式选择:NAT与桥接的区别
新手最困惑的往往就是“网络连接”这一项。VMware有三种常见网络模式:
- 桥接模式:虚拟机像一台独立电脑接到和宿主机同一个局域网上,有自己的IP,局域网内其他机器能直接访问它。
- NAT模式:虚拟机通过宿主机上网,IP是VMware内部虚拟网段分配的,外部设备看不到虚拟机。
- 仅主机模式:虚拟机只能和宿主机通信,不能访问外部网络。
从C++开发学习角度来说,初期用NAT就够了,能联外网更新软件包,环境也干净。等后面做网络编程、搭建服务器调试时,再改成桥接模式更容易测试(比如在浏览器里访问虚拟机里起的Web服务)。两个模式切换只是点一下按钮的事,不用重装系统。
4. CentOS安装全程详解:从引导界面到GCC验证
CentOS系列的安装器是Anaconda,界面风格和Windows安装程序差别不大,只要理解每一步的含义就能顺利走完。下面以CentOS Stream 9为例走一遍。
4.1 引导界面与语言、时区设置
从ISO引导后进入界面,第一个选项是“Install CentOS Stream 9”(如果你看到的是“Test this media”,选Install即可)。语言选择建议选“English”,不是英文水平不行,而是因为中文翻译在某些系统工具上有滞后,英文界面在后续搜索错误信息、对照文档时最准确,这一点对C++开发非常关键——因为你后面会遇到各种编译错误,搜索的时候英文关键词的命中率高得多。
时区建议直接选“Asia/Shanghai”,系统默认会用UTC / GMT时区,如果你选了其他时区,后面写日志、查时间时会混乱。
4.2 软件选择:必须勾选“Development Tools”
这是CentOS安装里和C++开发关系最密切的一个选项,也是全篇最容易踩坑的地方。
CentOS默认的“最小安装”只带基本系统,里面连GCC都没有。点开“软件选择”,建议选择“带GUI的服务器”或者“工作站”(取决于你需不需要图形界面),然后在右侧附加组件里务必勾选“Development Tools”(开发工具)。这一个勾选会引入gcc、gcc-c++、make、gdb、autoconf、flex、bison等一整套编译工具链,后面装C++环境能省下大量手动安装时间。
如果第一次安装没勾这个,后面也没有办法通过“系统设置”补回来,只能命令行执行dnf groupinstall "Development Tools",虽然也不难,但等于重复下了一大堆依赖包,浪费时间。
4.3 分区方案:自动分区还是手动分区?
对新手,我的建议是直接使用“自动配置分区”。Anaconda默认的LVM(逻辑卷管理)方案在1TB以内的所有磁盘上都没问题,LVM的好处是以后空间不够可以在线扩展。
完全手动分区适合有经验的人,例如你打算把/home单独分一个区、给/opt挂一个专门的数据盘,这种灵活度在服务器场景才有意义。C++开发学习场景完全不涉及裸设备和高性能IO,自动分区省心且足够。
唯一需要留意的是,各版本CentOS在“磁盘选择”页面会把宿主的磁盘也列出来,千万别选错盘。不过虚拟机环境里通常只会看到一块虚拟磁盘(比如/dev/sda),确认一下就无所谓。
4.4 网络和主机名设置
这一页看起来无关紧要,但如果你不设置,安装出来的系统默认网络是“连不上”的。
在“网络和主机名”页面里,打开“以太网右侧的开关”,确保状态是“已连接”,同时给主机取一个简单好记的方案,比如centos-dev。DHCP模式在这里直接用就可以,IP地址后面随时可以改。
4.5 安装完成后的GCC验证
等待安装过程跑完、重启,首次登录看到的是终端界面或图形登录界面。在终端里输入:
whoami确认以普通用户身份登录后,切换到root:
su -然后验证开发工具是否装好了:
gcc --version g++ --version make --version这几条命令正常输出的话,你手里这台CentOS虚拟机就已经具备C++编译能力了。如果提示command not found,则说明你安装时漏掉了“Development Tools”,这时执行:
dnf groupinstall "Development Tools"等它装完再验证一次就好。这个命令在联网状态下会自动下载几百MB的依赖包,耐心等就行。
5. Ubuntu安装全程详解:Desktop版与服务版的取舍
Ubuntu的安装路径和CentOS不一样,但它的图形化安装程序做得更流程化,上手门槛更低。这里重点讲两个容易被忽略的决策,以及C++开发视角下的几个注意点。
5.1 Ubuntu Desktop还是Server?关键看你的使用习惯
Ubuntu Desktop自带GNOME桌面环境,开箱即用有图形界面,浏览器、文件管理器、文本编辑器一应俱全,对完全没接触过Linux的C++新手非常友好。Server版本则没有图形界面,只有纯命令行终端,资源占用小,更接近生产服务器环境。
C++开发学习阶段我更推荐Desktop版,原因很简单:你还要用VS Code、看PDF文档、开浏览器查资料,一个桌面环境能省很多切来切去的时间。不要在“要不要用命令行装一下”这种事上给自己增加无谓的挫败感——等你在Desktop版上把C++编译流程跑熟了,再用Server版装一遍就是水到渠成的事情。
下载时记得选“Desktop image”,文件名通常是ubuntu-22.04.x-desktop-amd64.iso这种格式。
5.2 安装过程的关键节点:语言、键盘布局与最小安装
用UltraISO后烧录,或者直接在VMware里挂载ISO启动。引导之后,选择“Install Ubuntu”进入正式安装。你需要走过几个节点:
- 语言这里和CentOS不同,Ubuntu的中文支持做得相当好,用中文安装完全不影响后续搜索,所以按自己习惯选即可。
- 键盘布局保持默认“English (US)”,不要选拼音输入法相关的布局,否则敲快捷键的时候会莫名多出个输入法切换步骤。
- 更新和其他软件页面中,“安装类型”推荐选“最小安装”(Minimal installation),这样不会预装大量用不上的办公软件和游戏;同时把“安装第三方软件”勾取消掉,这个选项通常和显卡驱动有关,在虚拟机里不需要,反而可能拉慢安装。
分区这一步Ubuntu比CentOS简单得多,选择“清除整个磁盘并安装Ubuntu”,注意这里“磁盘”指的是VMware虚拟出来的那块虚拟磁盘,不会影响宿主机文件。加密选项建议不加密码,否则每次开机都要输两遍解密口令,学习时纯属折腾。
5.3 首次登录后的基础清理与系统更新
安装完成重启,进入Ubuntu桌面后,先打开终端执行一次系统更新:
sudo apt update sudo apt upgrade -y这个命令会把系统自带的软件包源索引刷新一遍,并把仓库里能升级的包全部升到最新版。C++开发中很多诡异报错都来源于“软件源里的包版本太旧”和“编译器版本太高”两头不一致,先把系统拉到一个最近状态能避开很多坑。
顺手安装几个接下来肯定要用的开发基础设施:
sudo apt install -y build-essential gdb cmake git curlbuild-essential这个包是Ubuntu里编译工具的集合包,装完它,gcc、g++、make就全部就位了。这套组合装完,你可以自测一下:
g++ --version cmake --version都能输出版本号,说明这台Ubuntu虚拟机已经能作为C++开发环境使用了。
6. 装完系统后的必修课:增强工具、快照与网络配置
系统和编译器都就位之后,有几件“看起来不重要但实际很有用”的配置,值得花十分钟搞定。它们直接影响你后续整个开发周期里的体验。
6.1 安装增强工具:VMware Tools与Open VM Tools
VMware Tools(新版叫Open VM Tools)是VMware虚拟机与宿主机之间的“桥梁”套件,主要解决三个问题:鼠标光标在虚拟机里卡住、屏幕分辨率不能自适应窗口大小、共享文件夹等功能不可用。
在CentOS和Ubuntu上都推荐在安装完系统后第一时间安装它。两个系统上命令略不同:
Ubuntu:
sudo apt install -y open-vm-tools open-vm-tools-desktopCentOS:
sudo dnf install -y open-vm-tools装完重启一次,之后VMware窗里切换桌面时,鼠标就不会像“困在窗口里”一样卡住了,窗口拉大拉小屏幕分辨率还能跟着变。这一步没装之前你可能会觉得虚拟机“肉眼可见地卡”,装了之后体验会瞬间好很多。
如果你用的是旧版VMware或某个发行版支持不佳,也可以走传统路径:在VMware菜单栏选择“虚拟机 -> 安装VMware Tools”,然后在系统里挂载光盘运行安装脚本。不过新版本在联网条件下用Open VM Tools基本就够了,更省事。
6.2 快照:给你的虚拟机上一份“后悔药”
虚拟机最大的优势就是可以随心所欲地折腾而不必担心搞坏。快照就是把这些折腾的“后悔药”做到极致。
系统刚装完、工具链自测通过那一刻,在VMware菜单栏点击“虚拟机 -> 快照 -> 拍摄快照”,命名成“系统干净已含开发工具”之类好认的名字。以后你配置环境变量、装软件包出了任何问题,只要启动到VMware主界面,右键虚拟机名,选“快照 -> 恢复”,十几秒就能回到这个黄金状态。
一个被我反复验证过的小经验是:快照不要拍太频繁,每次系统处于“可复现的、干净的、有下一步操作价值”的状态时再拍。拍多了反而分不清各个快照之间差了什么,找起来费劲。
6.3 网络配置:DHCP够用,但建议改成静态IP
虚拟机里的IP地址默认通过DHCP自动分配。问题在于,每次重启虚拟机,它的IP都有可能变。如果你后面要在虚拟机里跑一个Web服务器或者SSH服务,一变IP你就得回头重新查,很烦。
改成静态IP的方法是(以Ubuntu 22.04为例):
sudo nano /etc/netplan/01-network-manager-all.yaml找到网卡配置,写上:
network: version: 2 renderer: NetworkManager ethernets: ens33: dhcp4: no addresses: - 192.168.174.10/24 routes: - to: default via: 192.168.174.2 nameservers: addresses: [114.114.114.114, 8.8.8.8]注意,192.168.174.x是VMware默认NAT网段的示例,你可以在VMware菜单“编辑 -> 虚拟网络编辑器”里看到自己的实际网段。改完执行:
sudo netplan apply然后ip addr确认IP已经变成你设置的静态地址。CentOS 9的同学则改/etc/NetworkManager/system-connections/下的配置文件,或者用nmcli命令操作。这里建议学习阶段先别纠结静态IP,等真需要固定地址时再改也行。
6.4 顺手验证C++工具链,并给下一篇文章留一个入口
到这个位置,你的CentOS或Ubuntu虚拟机已经是一台名副其实的Linux开发机器了。顺手验证一下:
echo 'int main(){return 0;}' | g++ -x c++ - -o /tmp/test && /tmp/test && echo "compile ok"能看到compile ok,说明从系统内核到编译器这条链路完全畅通。
下一篇文章我会在这两台系统里面分别配好完整的C++开发工具链:GCC参数精讲、GDB调试器、Makefile和CMake工程管理,再装好VS Code的远程开发插件,让你在Windows的VS Code里直接写虚拟机里的Linux代码。到时候你会发现,虚拟机里的Linux用起来和隔壁一台独立开发机几乎没有区别。
我在过去这几年里帮不同基础的入门者配过很多套开发环境,踩过的坑比大多数人听过的都多。最后提醒三个最容易让新人翻车的地方:第一,创建虚拟机时内存不要少于4GB,否则编译器会以难以理解的方式报错;第二,磁盘空间宁大勿小,你后面学的OpenCV、TensorFlow、Boost这些库,每一个都愿意理直气壮地吃好几GB;第三,装完系统趁早拍快照,这个动作三分钟顶得上日后重新配环境的三小时。
虚拟机这个东西,熟练之后你会觉得它平淡无奇,但回头看,它给C++入门者提供的是一个怎么折腾都不怕试错的安全区。把所有奇怪的编译错误、库依赖冲突、环境变量混乱都留在虚拟机里解决,你会学得更踏实。