尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Ubuntu下C语言自学路线:从虚拟机搭建到第一个程序

发布时间:2026/9/26 10:32:52

资讯中心
01
ARTICLE

Ubuntu下C语言自学路线:从虚拟机搭建到第一个程序

Ubuntu下C语言自学路线:从虚拟机搭建到第一个程序
在Ubuntu里学C语言确实比在Windows上多了点折腾但这份折腾很值得。这篇是这个系列的第一篇也是我基于自己的上手经历整理出的一套完整的环境搭建和入门路线从虚拟机安装Ubuntu、配置开发环境到写第一行代码、踩最常见的坑一步一步说清楚。不管是大学刚开始学编程、准备计算机二级或考研专业课还是工作后想补一补底层基础都可以直接用这份方案起步。我尽量把每个环节“为什么这么做”也讲明白省得你后面出问题了不知道怎么排查。1. 内容整体设计与思路拆解1.1 为什么用Ubuntu学C语言很多人第一反应是Windows环境下用Dev-C或Visual Studio不是也能学C吗为什么要装Ubuntu这不是自找麻烦说句实在话对于只打算把期末考试混过去的那批人Windows确实够用。但如果你是想把C语言真正学明白Ubuntu这条路线会少很多干扰多很多收获。原因其实很朴素C语言的归宿本来就是Linux这类类Unix系统。你看教材里写的open、read、fork、socket这些系统调用全是Linux下的东西企业里的嵌入式开发、服务端后台、驱动开发也基本是在Linux上干活。用Ubuntu学C等于把学习和真实工作环境对齐了。还有一个更实际的好处Ubuntu自带gcc、gdb、make这些工具链安装命令就一条不像在Windows上配MinGW那么折腾。而且gcc是C语言的事实标准编译器C语言的很多“未定义行为”或细节差异只有到了gcc的环境里才能真正体会到。比如char到底是signed还是unsigned这在不同的平台和编译器下表现不一样用gcc看unistd.h这些头文件源码理解得更清楚Windows上的IDE把这些都藏起来了你反而学得稀里糊涂。1.2 这套自学的整体路线是什么我给自己设计的方案是虚拟机 Ubuntu 22.04 LTS gcc VSCode按四条线推进。第一条线是环境线搞定Ubuntu系统的安装和基本配置保证有一个干净好用的Linux环境。第二条线是工具线把gcc编译器、VSCode编辑器、终端命令这些配套工具装齐并理解编译过程中预处理、编译、汇编、链接各环节在干什么。第三条线是语言线从main函数和变量类型切入依次掌握输入输出、分支循环、数组、指针、函数、结构体、内存管理这些C语言核心知识点。第四条线是排错线把自学中一定会遇到的坑提前列出来比如安装gcc失败、环境变量出问题、scanf缓冲区不干净、中文输入法调不出来等按图索骥去解决。这个系列的第一篇重点放在环境和工具链上。毕竟环境没搭好后面全是空中楼阁。语言线我会给出第一课的一部分——输入输出和基础类型的几个容易踩坑的点其余的放后续文章展开。1.3 方案选型虚拟机、双系统还是云主机自学者最常见的困惑是我用VMware装个虚拟机够吗还是应该直接装双系统或者干脆买个云服务器远程练我的建议很明确新手首选虚拟机尤其是VMware Workstation Player或VirtualBox。虚拟机最大的好处是安全、可回滚。你在里面随便折腾什么sudo rm -rf、改坏配置、删了系统关键库反正只是一个虚拟磁盘文件坏了快照一恢复就行了宿主机的Windows完全不受影响。这对自学者来说太重要了因为你刚开始的时候一定会手贱乱敲命令。双系统则不行万一grub引导坏了你Windows都进不去那种挫败感足以劝退一大半人。云服务器的路径也不太适合零基础。因为你需要在本地ssh连上去vi编辑文件终端客户端、密钥认证这些概念叠加在一起很容易把学C语言的精力分散掉。本地图形界面的Ubuntu桌面能看、能点、能复制粘贴学习曲线平滑得多。等你在虚拟机里把Ubuntu、gcc、VSCode这一套玩熟了再去折腾双系统或纯命令行服务器那是顺水推舟的事不用一步到位。2. Ubuntu安装与基础配置实操2.1 镜像下载版本选择和来源说明安装Ubuntu第一步是下载镜像文件。版本上我推荐22.04 LTS不是最新版的24.04或26.04而是求稳。LTS是长期支持版本Canonical官方保证安全更新到2027年社区里的教程、问答、软件包支持都是最全的你搜到一个报错信息八成答案都是基于22.04的。新的非LTS版本特性多但配套资料少遇到问题只能自己去翻英文社区新手没必要凑这个热闹。下载地址直接搜“Ubuntu官网镜像下载”就行注意域名是ubuntu.com不是乱七八糟的第三方站。官网会给你两种镜像桌面版Desktop和服务器版Server。我们选桌面版文件名类似ubuntu-22.04.5-desktop-amd64.iso。amd64表示64位x86架构现在绝大多数电脑都是这个。另外下载后最好核对一下SHA256校验值把下好的文件拖到Windows终端里执行certutil -hashfile 文件名 SHA256和官网给出的值对比防止下载损坏或文件不完整。2.2 虚拟机创建要点打开VMware Workstation点“创建新的虚拟机”选择“典型”模式。镜像文件选择刚才下载的ISO保持“稍后安装操作系统”也一样因为Ubuntu的Live环境支持图形化安装你直接进入桌面再装也行。硬件配置上建议给虚拟机分配最少4GB内存、60GB磁盘CPU给2核以上。如果你笔记本物理内存是8GB那给虚拟机4GB是上限了再多宿主机会卡。磁盘选“拆分为多个文件”也行“单个文件”也行前者备份和移动更方便后者性能稍好一点。关键一步是在“自定义硬件”中把网络适配器设为“NAT模式”。这个模式的意思是虚拟机通过宿主机共享网络上网虚拟机在私有网段里宿主机看不到你虚拟机的细节但虚拟机可以访问外网。这对后面apt下载软件包很重要。还有两个细节一是虚拟机的“显示”设置里把“加速3D图形”勾上Ubuntu的GNOME桌面特效会更流畅二是“USB控制器”可以选USB 3.1后面拷贝文件更舒服。这些都可以等系统装完再调不用太纠结。2.3 系统安装过程中几个容易忽略的选项从ISO启动后会进入Ubuntu的欢迎界面选“Install Ubuntu”进入安装向导。语言选简体中文键盘布局默认English (US)即可别选Chinese不然以后敲命令时符号键对不上。安装类型里一定选“清除整个磁盘并安装Ubuntu”——这是在虚拟机里随便清。新手最怕的就是在这里看到“其他选项”就点进去手动分区其实完全没必要。Ubuntu默认的LVM分区方案对学习C语言来说绰绰有余手动分区反而容易把/boot、/swap搞乱后面空间不够了还不知道怎么扩。创建用户时用户名设置成全小写英文例如learner或ubuntu。姓名可以填中文但用户名最好保持ASCII字符。还有一个隐藏选项如果你勾了“加密我的主文件夹”这会给整个home目录加密以后如果忘记登录密码恢复数据会非常痛苦。新手不要勾。安装过程中有个“下载更新”和“安装第三方软件”的复选项。在网速好的情况下可以勾上下载更新第三方软件那个暂时不勾也行因为很多是显卡驱动和媒体解码器对C语言学习帮助不大反而可能造成兼容问题。2.4 安装后的基础设置四件套系统装好进入桌面后按顺序做四件事。第一件更新软件源。Ubuntu默认的源在国外国内访问速度慢得能让人怀疑人生。我之前的做法是换成国内高校或云厂商的镜像源。具体操作为在“软件和更新”里把“下载自”改为“其他站点”搜aliyun或tuna选清华大学的TUNA镜像源。改完以后在终端执行sudo apt update让源缓存刷新。这一步做完后面安装gcc、VSCode的速度会有天壤之别。第二件安装VMware Tools或open-vm-tools。新版VMware装的Ubuntu一般默认就带open-vm-tools了如果没有执行sudo apt install open-vm-tools open-vm-tools-desktop。它的作用是让虚拟机窗口自适应分辨率、支持宿主机和虚拟机之间的剪贴板共享和文件拖拽。没装它的话你后面复制代码会非常痛苦。第三件设置中文输入法。搜“ubuntu中文输入法怎么设置”结论是装ibus-rime或fcitx5然后设置里添加输入源。我推荐fcitx5因为它在中文输入兼容性和候选词体验上都不错。装完以后重启一下或者注销重登右上角输入法图标出现后按CtrlSpace切换中英文。这一步不急着做等第一课代码写完要写中文注释了再弄也行。第四件配置VSCode需要用到的一些基础工具。包括安装git、curl等后面写代码版本管理会用到。这三个都是命令行工具sudo apt install git curl -y搞定。3. C语言开发环境搭建与第一个程序3.1 gcc的安装与验证C语言在Ubuntu下的标配编译器是gcc安装命令只需一条sudo apt update sudo apt install build-essential -ybuild-essential是一个元包除gcc外还包含g、make、libc-dev等一整套编译所需的工具。很多网上教程只让你装gcc但之后写多文件工程时要用make所以一次性把build-essential装上省心。注意如果执行sudo apt install时提示“无法定位软件包gcc”或“E: 软件包 gcc 没有可安装候选”大概率是软件源没更新或源文件配置有问题先执行sudo apt update不行再看/etc/apt/sources.list里源地址是否配好。装好后执行gcc --version能看到类似gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0的输出说明编译器就位。再执行which gcc看看路径一般是/usr/bin/gcc。还记得热搜里有人问“ubuntu安装gcc失败”吗十有八九就是他们没先跑sudo apt update直接install结果找不到软件包。这里顺带解释一下为什么用gcc而不是Windows上的Visual Studio。gcc的编译过程是透明的你可以用-save-temps参数保留中间文件能看到预处理后的.i文件、汇编的.s文件。C语言的编译过程四个阶段——预处理、编译、汇编、链接在gcc这里都能亲眼看到。Windows的IDE把这些过程藏得严严实实对初学者来说反而是个黑箱。3.2 编辑器选型VSCode还是Vim关于编辑器我建议双轨制平时写代码用VSCode遇到要改配置文件时用nano或vim。VSCode装起来不难去官网下一个.deb安装包然后sudo dpkg -i code.deb。也可以走命令sudo apt install ./code.deb这样能自动处理依赖。装好VSCode后再装C/C扩展Microsoft官方发布的那个它会自动调用codelldb做调试。再装一个Remote - SSH不需要我们是本地开发不需要远程。唯一建议加的是“Chinese (Simplified) Language Pack”把界面变成中文减少心理负担。Vim是编辑器之神但新手被vim劝退的例子太多了。我当年第一次进vim不知道怎么退出按了无数个Esc加冒号都没用最后只能强制关终端。所以对于零基础学习者VSCode这种图形化编辑器是正路vim等C语言功底扎实了再接触。3.3 第一个C语言的完整流程装好工具以后按照下面的流程写第一行代码。先建一个工作目录我习惯在home下建一个code文件夹mkdir ~/code cd ~/code然后创建文件hello.c。用VSCode打开整个文件夹code ~/code左侧资源管理器里新建hello.c输入以下代码#include stdio.h int main(void) { printf(Hello, Ubuntu C!\n); return 0; }保存后按CtrlShift打开集成终端先切到当前目录然后编译gcc hello.c -o hello ./hello看到终端输出Hello, Ubuntu C!第一个程序就跑通了。这一步的完整过程包含了很多初学者容易假懂的细节gcc hello.c -o hello里的-o表示输出文件名为hello如果不写-o默认会生成a.out这个名称历史原因来自Unix System V代表assembler output现在其实是链接器输出。运行程序为什么写./hello而不是hello因为当前目录不在PATH环境变量中必须用./指明确认当前目录下的文件。这些细节我在后面章节还会展开。3.4 编译过程原理解读从代码到可执行文件只用一条gcc命令程序就跑起来了但这背后其实包含了四个阶段。我用一个生活化的比喻把C代码当成一份菜品制作流程预处理阶段是根据口味准备配料把#include的内容展开、把#define的宏替换编译阶段是把中文流程翻译成英文生成汇编语言汇编阶段是把英文流程做成半成品预制菜生成机器指令的目标文件链接阶段是把各种预制菜拼成完整的宴席把目标文件和库文件合并成可执行文件。用gcc -v hello.c -o hello可以看到每个阶段调用的子程序。有兴趣的可以加上-save-temps参数gcc -save-temps hello.c -o hello这时目录下会多出hello.i、hello.s、hello.o三个文件。用文本编辑器打开hello.i能看到stdio.h的内容被完整展开几百行代码都是从系统头文件复制进来的。再看hello.s是汇编语言对于我们初学者不用看懂但能感受到从高级语言到底层语言的翻译过程。hello.o是二进制文件直接cat会乱码用file hello.o能看到它是ELF格式的可重定位文件。搞清楚这个过程对后面学编译原理、调试器使用、双机联调都有帮助。特别是以后碰到链接错误undefined reference to xxx你会知道这是最后一个阶段出了问题要么是库没链接要么是函数声明和定义对不上。3.5 VSCode里配置一键编译运行命令行操作虽然正统但每次敲gcc与./hello也嫌烦。可以在VSCode里配置tasks.json实现一键编译。按CtrlShiftP输入Tasks: Configure Task选择Create tasks.json file from template然后选Others填入以下配置{ version: 2.0.0, tasks: [ { label: gcc build, type: shell, command: gcc, args: [-g, ${file}, -o, ${fileDirname}/${fileBasenameNoExtension}], group: { kind: build, isDefault: true } } ] }这里有一个参数要特别说明-g。作用是在生成的可执行文件中包含调试信息后面用gdb调试和VSCode的调试器都需要它。args里的${file}是当前打开的文件${fileBasenameNoExtension}是去掉扩展名的文件名。这样你在hello.c界面按CtrlShiftB就能生成编译任务终端下面会显示编译过程。如果编译成功再用终端执行文件。更进一步的调试配置可以建launch.json用gdb来设置断点、查看变量值。我建议第一个月先不学调试先把代码写对、把报错看懂后面遇到段错误了再引入调试工具。4. C语言基础入门第一课从Hello到输入输出4.1 main函数与程序结构第一个程序的入口是main函数。C标准规定main函数的返回类型必须是int表示程序结束时的状态码。返回0说明正常结束返回非零值就表示出错了。这个约定同时适用于Linux和Windows但Linux下你可以直接在shell里用echo $?看到返回值./hello echo $?如果输出0程序正常。这个习惯对以后写脚本、做自动化部署非常有用。main函数还有两种写法int main(void)和int main(int argc, char *argv[])。初学者先只用第一种表示不接收任何命令行参数。第二种写法涉及指针和数组等到学习指针那章再用。还有一点初学者经常困惑的是为什么我做练习题时main函数前面总有一堆#include stdio.h这其实是把预处理指令和函数定义混在一起了。stdio.h是标准输入输出头文件里面声明了printf和scanf函数。如果不包含它gcc会给你一个警告implicit declaration of function ‘printf’在C99标准下这甚至是错误。所以以后写代码凡是要用printf、scanf、fgets就必须包含stdio.h。4.2 变量与数据类型一个常见的错误示例接下来是变量。C语言的数据类型主要就几类整型的int、浮点型的float和double、字符型的char。初学阶段最容易在printf和scanf的格式控制符上犯错我就用热词里那个“c语言变量用%d输入一个字符后的值”的例子来演示一下。看这段代码#include stdio.h int main(void) { char c; printf(请输入一个字符: ); scanf(%d, c); printf(你输入的值是: %d\n, c); return 0; }我故意把scanf的格式控制符写成%d但实际上c是char类型。编译器会给你警告format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’。表面上看只是类型不匹配但更严重的是运行时的问题。scanf读到的是一个整数值而内存中char只有1字节scanf会把读到的数字按int大小4字节写入c的地址直接越界改写相邻内存。轻则数据错乱重则造成栈破坏。这个例子的教训是scanf的格式占位符必须和变量类型严格对应。int用%dfloat用%fdouble用%lfchar用%c。这里我没有故意去“修复”代码而是希望初学者一定要重视编译器的警告那不是装饰品。在Ubuntu下gcc默认不会把所有警告都打开。建议编译时加几个选项gcc -Wall -Wextra hello.c -o hello-Wall打开大部分警告-Wextra再补充一些额外检查。老练的程序员写代码时都习惯带着这两个参数甚至还有-Werror把所有警告当作错误。新手用-Wall就够了别开-Werror不然警告太多会直接卡住你光看报错就够泄气了。4.3 scanf的一个大坑残留的换行符与缓冲区C语言初学还有一个非常经典的坑连续两次调用scanf第二次老是读不到内容尤其涉及字符读取时。原因是第一次输入数据后按下的回车键换行符\n残留在输入缓冲区里第二次scanf(%c, c)直接把残留的\n读走了所以看起来就是“跳过”了。一个非常简单的复现场景#include stdio.h int main(void) { int num; char ch; printf(输入一个整数: ); scanf(%d, num); printf(输入一个字符: ); scanf(%c, ch); printf(整数%d, 字符%c\n, num, ch); return 0; }运行一下你会发现第二个输入根本没让你敲键盘直接就输出了整数和换行符。原因上面说了。解决办法有几个。最简单粗暴的是在第二个scanf前加一条getchar()把残留的\n吃掉更规范的是用scanf( %c, ch)在%c前面加一个空格这个空格会匹配任意数量的空白字符等价于把前面的换行符跳过。还有一种是从一开始就用fgets读整行再用sscanf解析这是后话到了处理字符串再展开。类似这种缓冲区问题Windows上学C基本遇不到因为IDE会替你处理一些细节但Linux终端环境完全暴露出来。这其实不是坏事。因为真实世界里所有交互式的命令行工具都必须处理这些细节早点碰到反而能帮你建立“程序就是在这台机器上真实运行”的意识而不是活在IDE的假象里。4.4 为什么“Ubuntu环境”会改变你学C的体验用Ubuntu学C有一个特别隐蔽但长远的好处你会慢慢习惯“程序出错是常态出错了要看日志和报错而不是重启电脑”。Windows上IDE崩溃了你只会骂IDEUbuntu终端里gcc报出一大串红色错误你必须一行一行读去查它到底说的是哪一个文件和哪一行。这个习惯一旦养成之后读代码、改bug都有巨大帮助。而且终端下跑程序你能亲眼看到进程的退出码、信号、文件描述符这些是C语言底层的知识延伸对你的计算机根基帮助很大。5. 常见问题与排查技巧实录5.1 安装gcc失败怎么办依赖与源排查热词里“ubuntu安装gcc失败”出现的频率很高。这里我把排查思路梳理成一个速查表。现象可能原因解决方法sudo apt update时404或无法连接软件源不可达或配错编辑/etc/apt/sources.list更换为国内镜像源sudo apt install时提示“无安装候选”软件源列表没更新先sudo apt update再install提示“有几个软件包无法下载”网络不稳定或系统版本太旧换源或使用apt的-o Acquire::Retries3参数重试提示“锁 /var/lib/dpkg/lock 无法获取”后台apt进程占用sudo rm /var/lib/dpkg/lock或杀死aptd进程第二个问题里被锁的情况常发生在你刚装完系统后台的“软件更新”工具自动在跑。你可以直接sudo pkill -9 apt然后重新执行sudo apt update再安装。5.2 环境变量配置错误导致命令找不到热搜里有“ubuntu环境变量配置错误”这个我也栽过。初学Ubuntu的人如果自己往PATH里加了错误路径可能会导致所有命令都“command not found”。我当年有一次给PATH赋值时误写成export PATH/usr/local/sbin把原本的$PATH漏掉了导致所有基础命令瞬间失效。终端里ls、cd、sudo全都不认非常吓人。解决办法第一步不要关终端。在同一个bash会话里执行export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games把系统默认的PATH恢复起来这样sudo这类命令就回来了。第二步检查/etc/environment或~/.bashrc里哪一行写错了删掉或改好。第三步重新source ~/.bashrc或者注销重登。这里提醒一句修改环境变量前一定备份原文件cp ~/.bashrc ~/.bashrc.bak。这是老手都有的习惯。5.3 Ubuntu忘记登录密码的应急处理热词里也有“ubuntu忘记登录密码”。这个以后一定会遇到我提前写上。如果是普通用户忘了登录密码最稳妥的解决方式是进入恢复模式recovery mode。开机时按住Shift进入GRUB菜单选择Advanced options for Ubuntu再选recovery mode然后选“root”进入root shell。执行passwd 你的用户名按提示输入新密码两次即可。如果root shell下挂载的是只读文件系统先mount -o remount,rw /。这个方法在虚拟机和双系统上都有效。但如果你之前勾了“加密主文件夹”恢复就会麻烦很多可能直接无法解密出数据。这也是我前面提到不要勾加密主文件夹的原因。5.4 VSCode终端中文乱码或输出乱码在VSCode集成终端里运行printf(你好)有时会看到乱码。根本原因是文件编码和终端编码不一致。Ubuntu桌面版默认使用的是UTF-8但VSCode的默认编码可能被Windows端的习惯潜移默化地改成了gbk。这时在VSCode右下角点击UTF-8选择“通过编码重新打开”改成UTF-8即可。终端本身的编码问题则可能是locale没设好。执行locale检查输出如果LANG不是zh_CN.UTF-8或en_US.UTF-8可以执行sudo dpkg-reconfigure locales勾选并生成en_US.UTF-8和zh_CN.UTF-8然后设置默认locale。5.5 新手必背的三条终端命令这一节最后把新学者一定用得到的三个命令列一下这三条是我每天至少各按一次的man 命令名 # 查看帮助手册比如 man printf注意这是shell命令不是C语言函数文档但也有参考价值 history # 查看历史命令按!编号可以重新执行比如 !100 grep -r 关键字 /目录 # 递归搜索目录下包含关键字的文件比如要查头文件定义就靠它用man查C语言函数文档需要装manpages-devsudo apt install manpages-dev然后man printf看出的是C语言printf函数的详细说明和示例。这个习惯能显著减少你搜索网页的时间。6. 一些个人的实操体会这套流程我自己走了一遍再加上帮几个完全零基础的朋友搭过环境有几个体会特别强烈。第一虚拟机里装Ubuntu时如果磁盘分配建议60GB但我发现实际用起来装完系统和一整套开发工具大概34GB左右。剩下的空间都是放源码和编译缓存用的。所以60GB的配置不用恐慌也不用贪多。第二VSCode里配置的tasks.json我建议直接用版本管理工具保存起来这样换机器的时候一键恢复开发环境不用每次重敲一遍。这也是培养“配置即代码”习惯的起点。第三遇到问题不要刷新就开始的全中文搜索。很多Ubuntu和C语言的报错信息直接搜索报错原文、加上英文关键词效率比中文搜索结果高得多。这不是排斥中文而是因为技术社区的主流讨论还是英文的包括Stack Overflow和Ubuntu官方论坛第一条命中往往就是大家踩坑无数后总结出的标准解。第四写C语言的前两周不要用任何代码补全或语法检查工具老老实实地在终端里写、编译、看报错。这不是自虐而是在建立“语法错误和逻辑错误”的敏感度。等你完全适应了报错语言再启用VSCode的智能提示不迟。智能提示会掩盖很多细节错误比如缺少分号、函数名拼错尤其对初学者来说非常不利。这个系列下一篇会进入指针和数组我在Ubuntu下也会准备好测试环境到时候把指针存储、内存地址、字符串处理这些知识点从头到尾捋一遍尤其是那个经典二维数组和指针数组的区分问题我会用实际的打印例子说明白。先写到这儿环境搭好以后剩下的就是你自己的代码量了动手写出来的东西才是你自己的。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。