尧图精选

ege19.01图形库配置详解:DEV-C++与VsCode从零跑通

🕒 发布时间:2026/10/1 15:49:10 📁 来源:尧图网络
如果你正在学 C 语言八成听过 DEV-C 这个上古神器如果你被课程设计逼着要写个带界面的程序大概率也已经搜到了 ege 这个图形库。我帮不少同学配过 ege19.01 的环境发现一半以上的人卡在同一个地方库文件不会选、链接参数不会写换到 VsCode 后又不知道去哪配置。这篇文章把我踩过的坑一次性理清楚从 DEV-C 和 VsCode 两条路分别讲保证你跟着操作十分钟能跑起来。1. ege19.01 是什么从 Turbo C 到 Windows 图形界面的桥梁1.1 你学的 C 只有黑窗口但课程设计需要图形界面学校教 C 语言基本都是在控制台里敲 printf、scanf输出一片黑底白字。可一旦到了课程设计阶段老师突然让你做个学生成绩管理系统贪吃蛇游戏甚至画图板控制台那套东西瞬间就不够用了。直接用 Windows API 写窗口学习曲线太陡——光是 CreateWindow 那一堆参数就足够劝退新手。egeEasy Graphics Engine就是为解决这个尴尬而生的。它是一个开源的 C 图形库核心设计思路是让你用接近 Turbo C 时代 BGI 图形库的写法快速在 Windows 窗口里画点、画线、画圆、显示图片、处理鼠标键盘事件。你不需要理解 GDI 内部机制几行代码就能出一个带窗口的图形程序。1.2 ege 能做什么边界在哪里ege19.01 这个版本我用下来常见的 2D 需求基本都覆盖了基本绘图点、线、矩形、圆、椭圆、扇形、填充色、背景色文字显示outtextxy 在指定坐标输出字符串图片加载可以读 BMP、PNG、JPG 等常见格式并贴到窗口上鼠标键盘MouseHit、getmouse、keystate 等 API 做交互双缓冲机制BeginBatchDraw / FlushBatchDraw 配合动画不闪烁音频配合其它库能播放音乐不过这块我一般直接用 Windows 的 PlaySound少一点依赖它的边界也很明显只支持 Windows、只适合 2D 轻量级图形程序、没有现成的 UI 控件按钮、输入框都得自己画。如果你要做 3D 游戏、复杂软件界面或者需要跨平台那该用 Unity、Qt 或者 SDL而不是 ege。但作为教学和课程设计工具它足够轻、足够稳这也是为什么网上大量教程和实验课都指定它。注意ege 是一个库不是一个独立软件。它需要配合编译器使用所以你才会看到DEV-C 配 egeVsCode 配 ege这种说法。配环境这件事本质上就是告诉编译器三件事头文件去哪找、库文件去哪找、链接的时候带上哪个库。2. DEV-C 配 ege19.01一次点明白连库文件名一起讲清2.1 解压与放置include、lib、dll 分别放哪先说一下整体思路。DEV-C我推荐 Orwell Dev-C 5.11网上大多数教程也是按这个版本写的自带 MinGW 编译器配置 ege 的核心就两步让编译器能找到头文件和库文件让链接器知道要链哪个库。下载 ege19.01 后你会得到一个压缩包解压后里面有三个关键目录include、lib、dll。我习惯把整个压缩包解压到一个固定的地方比如D:\ege19.01不放 C 盘系统目录免得权限问题。目录结构大致是这样D:\ege19.01\ include\ graphics.h ege.h ... lib\ libgraphics.a libgraphics64.a ... dll\ ege.dll ege64.dll README.txt这里我要专门提醒一句不同网络来源的 ege 压缩包文件名可能有差异有的叫 libgraphics.a有的叫 libEGE.a有的把 64 位库单独放在 x64 子目录里。一切以你实际解压出来的文件名为准README.txt 里通常写得很清楚。2.2 识别库文件确定你该用哪一个链接参数这是很多人配置失败的第一道坎。MinGW 编译器在链接静态库时-l参数会去找libxxx.a这样的文件。比如你看到 lib 目录下有一个libgraphics.a那链接参数就是-lgraphics如果文件叫libEGE.a参数就是-lEGEWindows 下大小写在很多时候不敏感但建议按实际大小写来。还有一个关键点DEV-C 5.11 自带的编译器是 32 位的 TDM-GCC 4.9.2所以它只能链接 32 位的库文件。如果你下载的压缩包里同时有 libgraphics.a 和 libgraphics64.aDEV-C 里必须选libgraphics.a32 位别拿 64 位的去试。如果你的包里只有一个 64 位库文件也不是完全没办法你可以单独给 DEV-C 配置 64 位编译器但这个操作比较折腾我建议直接换 VsCode 那条路或者下载一个明确标注for Dev-C的 ege 版本。2.3 全局配置与单个工程配置两个地方的参数都要加配置路径分两个层次建议按头文件和库目录做全局、链接参数做工程级来分工。第一步配置头文件和库目录打开 DEV-C菜单栏点工具 - 编译器选项在弹出的窗口里切到目录标签页C 包含文件里面添加D:\ege19.01\include库文件里面添加D:\ege19.01\lib这一步做完编译器就能找到 graphics.h 和静态库文件本身。第二步配置链接参数我比较推荐在单个工程里配置链接参数而不是全局配置。原因是链接参数会跟着所有工程生效如果你的其它 C 程序不打算用 ege加了反而会让编译器多找一次库有时还会报无关的错。具体操作在 DEV-C 里打开你的工程如果你只是随便写个单文件测试就新建一个Helloworld 项目或者直接新建 .cpp 文件菜单栏点项目 - 项目属性有的版本叫工程选项切到参数标签页在连接器那一栏加上-lgraphics -lgdi32 -limm32 -lmsimg32 -lole32 -loleaut32 -luuid如果你的库文件名不是 libgraphics.a把-lgraphics换成对应的名字比如-lEGE。后面那一串-lgdi32 -limm32 ...是 ege 依赖的 Windows 系统库少了它们链接时会报 undefined reference这个参数组合是 ege 文档里明确写的不要省。还有一个更粗暴但不容易出错的办法不猜库文件名直接把库文件的完整路径写在连接器参数里。比如D:\ege19.01\lib\libgraphics.a -lgdi32 -limm32 -lmsimg32 -lole32 -loleaut32 -luuidgccDEV-C 底层就是 gcc允许直接把 .a 文件当作输入文件处理这样完全绕开了-l名字匹配的问题。这个技巧在 VsCode 里同样能用后面我会再提到。2.4 复制 dll运行时最常见的第一个报错编译通过只是第一步。ege19.01 是动态链接的也就是说你的 exe 运行的时候需要一个叫 ege.dll 的动态库文件。如果这个文件不在 exe 同目录也不在系统 PATH 里双击运行时就会弹由于找不到 ege.dll无法继续执行代码。解决办法很简单把D:\ege19.01\dll\ege.dll复制到你的 exe 所在目录。如果你用 DEV-C 的运行按钮exe 一般生成在工程目录下的bin\Debug或者bin\Release里把 dll 复制到那个目录就行。提醒如果你的程序编译成了 64 位那运行时需要的可能是 ege64.dll 而不是 ege.dll具体以 README 说明为准。DEV-C 5.11 默认是 32 位用 ege.dll 基本没问题。3. VsCode 配 ege19.01从编辑器到编译器的完整链路3.1 为什么 VsCode 比 DEV-C 麻烦三件套各管一摊VsCode 本质上是一个文本编辑器它不负责编译。你要让它编译 C 程序需要凑齐三样东西编译器MinGW-w64 或其它 gcc、Microsoft 的 C/C 扩展负责代码高亮和智能提示、以及 .vscode 目录下的三个 JSON 配置文件tasks.json、launch.json、c_cpp_properties.json。很多人一看到三个 JSON 文件就头大但其实逻辑很简单tasks.json告诉 VsCode编译时执行什么命令对应你在终端里手动敲 g 指令launch.json告诉 VsCode按 F5 调试时启动哪个 exe、用哪个调试器c_cpp_properties.json只给代码提示功能看告诉 IntelliSense 头文件在哪、编译器是哪个不参与实际编译3.2 编译器、插件、三个 JSON 文件的分工逻辑先说编译器。我推荐单独安装一个 MinGW-w64不要用 DEV-C 自带的那套32 位太老配 VsCode 只能将就。现在网上比较主流的来源是 MSYS2、WinLibs、w64devkit。我自己的习惯是用 WinLibs 的独立压缩包解压即用不需要额外装环境。以我装在D:\mingw64为例里面关键的路径是D:\mingw64\bin\g.exe D:\mingw64\bin\gdb.exeVsCode 扩展我只装 Microsoft 官方的 C/C 插件扩展名就叫C/C发布者是 Microsoft。装完这个插件你的 .cpp 文件才会出现 IntelliSense也才能用 F5 调试。安装完扩展后打开一个文件夹作为工作区比如D:\ege_demo在里面建一个main.cpp。按下CtrlShiftP输入C/C: Edit Configurations (JSON)VsCode 会帮你生成一个默认的 c_cpp_properties.json我们先放着后面再改。3.3 tasks.json把编译命令写明白-lgraphics 还是直接写库路径编译这件事tasks.json 里要写清楚 g 需要执行的完整命令。我直接给你一份可用的配置把其中编译器路径和 ege 路径换成你自己的{ version: 2.0.0, tasks: [ { type: cppbuild, label: EGE 编译, command: D:/mingw64/bin/g.exe, args: [ -fdiagnostics-coloralways, -g, ${file}, -o, ${fileDirname}\\${fileBasenameNoExtension}.exe, -I, D:/ege19.01/include, -L, D:/ege19.01/lib, -lgraphics, -lgdi32, -limm32, -lmsimg32, -lole32, -loleaut32, -luuid, -mwindows ], options: { cwd: ${fileDirname} }, problemMatcher: [ $gcc ], group: { kind: build, isDefault: true }, detail: 用 g 编译 ege 程序 } ] }逐条解释一下command是 g 的绝对路径注意斜杠方向在 JSON 里用正斜杠或双反斜杠都行D:/mingw64/bin/g.exe这种写法最省事-I指定头文件目录后面跟 ege 的 include 路径-L指定库文件搜索目录后面跟 ege 的 lib 路径-lgraphics是链接库名如果你的库文件不叫这个参照 2.2 节的方法换成实际名字-mwindows表示这是一个 Windows GUI 程序编译出来的 exe 不会带黑色控制台窗口如果你不想纠结-lgraphics名字对不对直接把库文件全路径加进去去掉-L D:/ege19.01/lib和-lgraphics换成D:/ege19.01/lib/libgraphics.a这个完整路径被 g 当成一个输入文件直接参与链接不依赖-l的命名规则。这是我给新手推荐的做法因为它少一个不确定因素——你只需要确保路径和文件名跟实际解压出来的一致就行。3.4 c_cpp_properties.json消掉红色波浪线如果配置完 tasks.json编译虽然能过但编辑器里一直飘着红色波浪线提示graphics.h找不到那就是 c_cpp_properties.json 的问题。它是给 IntelliSense 智能提示用的不参与真实编译。在生成的文件基础上重点改动 includePath 和 compilerPath{ configurations: [ { name: Win64, includePath: [ ${workspaceFolder}/**, D:/ege19.01/include ], defines: [ _DEBUG, UNICODE, _UNICODE ], compilerPath: D:/mingw64/bin/g.exe, cStandard: c17, cppStandard: cpp17, intelliSenseMode: windows-gcc-x64 } ], version: 4 }includePath里加了D:/ege19.01/include之后graphics.h 的波浪线就会消失ege 的 API 也会有补全提示。intelliSenseMode里的windows-gcc-x64要和你安装的 MinGW 位数一致如果你装的是 32 位编译器改成windows-gcc-x86。3.5 launch.json也能用 F5 断点调试编译能过、提示也正常之后按 F5 还不能调试因为 VsCode 不知道启动哪个调试器、哪个 exe。在 .vscode 目录下创建 launch.json{ version: 0.2.0, configurations: [ { name: EGE 调试, type: cppdbg, request: launch, program: ${fileDirname}\\${fileBasenameNoExtension}.exe, args: [], stopAtEntry: false, cwd: ${fileDirname}, environment: [], externalConsole: true, MIMode: gdb, miDebuggerPath: D:/mingw64/bin/gdb.exe, setupCommands: [ { description: 为 gdb 启用整齐打印, text: -enable-pretty-printing, ignoreFailures: true } ], preLaunchTask: EGE 编译 } ] }注意preLaunchTask的值EGE 编译必须和 tasks.json 里的label完全一致否则按 F5 时会提示找不到任务。externalConsole设为 true 是建议因为 ege 程序会弹图形窗口用外部终端展示控制台输出更直观不容易跟 VsCode 集成终端打架。小技巧调试阶段我把 tasks.json 里的-mwindows临时删掉这样程序会保留一个黑色控制台窗口。printf 调试往窗口输出图形窗口正常显示非常方便。确认没问题之后再加回-mwindows发布时就没有那个黑框了。4. 第一个能跑的程序画圆、鼠标跟随、动画一锅端4.1 最小程序从 initgraph 到 closegraph配置完成后写第一个程序。新建main.cpp内容如下#include graphics.h int main() { initgraph(640, 480); // 创建一个 640x480 的图形窗口 setbkcolor(WHITE); // 设置背景色为白色 cleardevice(); // 用背景色清屏 setcolor(BLACK); // 设置当前绘制颜色为黑色 circle(320, 240, 100); // 在窗口中心画一个半径 100 的圆 getch(); // 等待按键 closegraph(); // 关闭图形窗口 return 0; }initgraph打开图形窗口closegraph释放资源。中间夹着的就是你的绘图逻辑。getch()的作用是让窗口停住不然程序一跑完窗口就关了。这个程序在 DEV-C 里直接按 F11编译运行或 CtrlF10在 VsCode 里按 CtrlShiftB 编译、然后运行生成的 exe或者按 F5 一条龙。能看到一个 640x480 的白底窗口中间一个黑色圆圈说明环境已经完全打通。4.2 鼠标和键盘交互的写法静态图形没什么意思ege 真正的价值是交互。下面这个程序让一个圆跟着鼠标走#include graphics.h int main() { initgraph(640, 480); int x 320, y 240; while (true) { if (MouseHit()) { mouse_msg msg getmouse(); if (msg.is_move()) { x msg.x; y msg.y; } } cleardevice(); setcolor(EGERGB(255, 100, 100)); circle(x, y, 30); delay_fps(60); // 控制帧率约 60fps } closegraph(); return 0; }ege 的鼠标 API 设计得很贴心MouseHit()判断有没有鼠标消息getmouse()取出一条消息msg.is_move()判断是不是移动消息msg.x / msg.y拿到鼠标坐标。EGERGB(r, g, b)是 ege 的颜色宏比 Windows 的RGB宏在部分场景下更省心。按 ESC 退出的写法也很简单在循环开头加一句if (keystate(VK_ESCAPE)) break;VK_ESCAPE是 Windows 标准虚拟键码ege 的keystate函数可以直接查状态。如果你只想按一下响应一次而不是按住持续响应用kbhit()配合getch()或者vkey()更合适看具体需求。4.3 帧动画与双缓冲别再用 while清屏硬拖了很多第一次用 ege 的人写动画会在循环里不断cleardevice()再画结果画面狂闪。这是因为每次cleardevice()都会真正刷新屏幕缓冲区超出垂直同步频率就会出现撕裂感。正确做法是用 ege 的双缓冲接口。双缓冲的逻辑一句话所有绘图操作先画到一块内存画布上画完之后一次性刷到屏幕上。中间没有中间帧暴露给用户视觉上就非常顺滑。ege 把这套封装成了三个函数BeginBatchDraw()、FlushBatchDraw()、EndBatchDraw()。下面是一个简单的圆周运动动画#include graphics.h #include math.h int main() { initgraph(640, 480); int cx 320, cy 240; double angle 0; BeginBatchDraw(); while (!keystate(VK_ESCAPE)) { int x cx static_castint(150 * cos(angle)); int y cy static_castint(100 * sin(angle)); cleardevice(); setcolor(EGERGB(255, 200, 50)); circle(x, y, 30); FlushBatchDraw(); angle 0.05; delay_fps(60); } EndBatchDraw(); closegraph(); return 0; }这里cos和sin需要math.h注意 ege 的坐标系统是屏幕上 x 向右、y 向下跟数学课本上的直角坐标不一样但反正圆周运动画出来视觉上还是圆不用过度纠结。提示BeginBatchDraw()和EndBatchDraw()之间不要放getch()这类阻塞函数某些版本会导致画面不刷新。需要等待用户按键时可以先FlushBatchDraw()再阻塞。5. 两套环境怎么选我的实际经验5.1 上课/快速验证选 DEV-CDEV-C 最大的优势就是开箱即用。编译器内置、界面简单、菜单点几下就能配好非常适合教学场景。我帮学生配环境时如果只是课堂上跑例题、交个作业我会直接推荐 DEV-C。它的缺点也很明显编辑器功能太老代码补全几乎等于没有拼错一个成员函数名要编译才能发现自带的 gcc 4.9.2 年代久远C11 支持一般调试器难用到我不想多说。所以它适合跑通和交作业不适合认真开发。5.2 课程设计/长期项目选 VsCode如果你要做一个正经的课程设计或者打算以后继续写 C我建议一上来就用 VsCode。虽然配置要花半小时但你换来的是IntelliSense 补全写initg直接带出initgraphF5 断点调试可以在circle调用前后暂停看变量值终端集成编码、编译、运行的反馈都在一个界面里后续要不要装 Code Runner、Git 插件、Markdown 插件都很自由VsCode 的麻烦是要自己写 JSON 配置但对新手来说照着上面 3.3、3.4、3.5 三节抄一遍就能跑成本再高也就一次。5.3 32 位与 64 位的匹配问题配置里最容易翻车的点两套环境放一起最容易被忽略的问题就是位数匹配。DEV-C 5.11 自带 32 位编译器VsCode 里装 WinLibs 的 MinGW-w64 大多是 64 位。如果你的 ege 压缩包里给出了 libgraphics.a32 位和 libgraphics64.a64 位两个文件那DEV-C 用libgraphics.a链接参数-lgraphicsVsCode 用libgraphics64.a链接参数-lgraphics64运行时 dll 同理32 位程序一般匹配 ege.dll64 位程序匹配 ege64.dll或者需要改名看 README。这个规则不是 ege 特有的任何 Windows 本机库都这样。一次我在帮同学排查问题他用 DEV-C 的编译器编译却在链接时顺手选了 64 位库文件结果疯狂报 undefined reference折腾半天才发现是位数不匹配。先确认位数再动配置顺序反过来会让你怀疑人生。我来做一个直观对比对比项DEV-C 5.11VsCode MinGW-w64初始配置成本低菜单点几下中高要写 JSON自带编译器位数32 位64 位可自行选择智能补全弱强调试体验老式 GDB勉强能用断点、变量监视都顺手适合场景课堂例题、快速验证课程设计、长期项目、后续深入学习6. 高频报错排查清单直接抄就好6.1 找不到 graphics.hinclude 路径没加报错长这样fatal error: graphics.h: No such file or directory。原因只有一个编译器不知道去哪找头文件。解决方法是检查你配置的 include 路径也就是 2.3 节或 3.3 节里的-I参数确认路径指向实际存在的D:\ege19.01\include目录并且目录下的文件名确实叫graphics.h不是graphics.h.txt。6.2 undefined reference库没链上或链的顺序不对这种报错信息很长通常是一大串undefined reference to xxx看着吓人但原因就几类完全没写链接参数检查 tasks.json 或 DEV-C 工程参数里有没有-lgraphics库文件没找到检查-L路径是否正确、库文件名是否匹配位数组不匹配32 位程序链了 64 位库或者反过来照样报 undefined reference链接顺序问题gcc 链接时-l参数要放在源文件之后。比如g main.cpp -lgraphics没问题但g -lgraphics main.cpp在某些情况下会直接漏链。建议所有-l都放在命令末尾6.3 找不到 ege.dll运行时路径问题编译过了运行时报找不到 ege.dll这个在 2.4 节已经讲过。补充一个扩展办法把 ege.dll 所在目录加到系统 PATH 环境变量里或者直接把 dll 复制到 C:\Windows\System32 下。前者更干净后者最快但系统目录攒太多第三方 dll 不是一个好习惯我仍然建议复制到 exe 同目录。6.4 控制台不显示 printf 输出-mwindows 的两面性配好环境后发现程序弹了图形窗口但看不到 printf 的输出别慌是你编译时带了-mwindows。这个参数把 PE 头的子系统标记成 GUIWindows 默认不分配控制台窗口所以 printf 的输出消失了。解决办法按 3.5 节提示的调试阶段去掉-mwindows发布时再加上。6.5 中文乱码编码方案从源头统一DEV-C 5.11 默认用 GBK 编码VsCode 默认 UTF-8。同一个outtextxy(100, 100, 你好)在 DEV-C 里正常在 VsCode 里乱码反之亦然。处理方法有两个统一源码编码在 VsCode 里点右下角编码按钮改成 GBK跟 DEV-C 一致内容用宽字符outtextxy(100, 100, L你好)配合 ege 的宽字符重载。但并不是所有版本都支持得一样好建议以测试为准我自己的习惯是人在 DEV-C 就全 GBK人在 VsCode 就全 UTF-8避免混合。6.6 DEV-C 的 gcc 太老新特性代码编译不过DEV-C 5.11 自带的 gcc 4.9.2 对 C11 支持得还行但对 C14/17 的新特性就很勉强。如果你把 VsCode 里编译通过的代码贴回 DEV-C 编译报错先想想是不是用了auto推导复杂类型、结构化绑定、std::optional这类特性。解决办法要么换编译器要么把要交的作业提前确认一下老师指定的 IDE 版本。这也是我最终推荐 VsCode 的理由之一——编译器的版本高表达能力完全不一样。我个人在实际操作中的体会是配置环境最花时间的其实不是 IDE 本身而是弄清楚自己下载的库是哪一位数、哪一个版本、README 里写了什么。ege19.01 压缩包内的 README.txt 基本涵盖了各 IDE 的配置参数先读它再动手至少能少走一半弯路。把这条路走通之后你会发现 DEV-C 和 VsCode 之间的切换并不难核心就一句话头文件路径、库文件路径、链接参数三样对齐环境就稳了。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →