在 Dev-C++ 或 Code::Blocks 下面配置 EasyX
前言
EasyX 虽然挺好用,但是目前官方只发布了针对 VC 的使用方法。本文介绍如何将 EasyX 配置到 DevCpp 或 CodeBlocks 里面,并提供相关的库。
平时我工作忙,有问题直接在后面留言,我会尽力修改。
注:版本太老的 mingw 无法支持。
库下载
配置说明
Code::Blocks 配置 EasyX 的详细说明
以下配置说明仅以官方原版 Code::Blocks 20.03(64 位)为例,下载地址:https://appzip.cn/codeblocks/w ,假设 Code::Blocks 的安装路径为 D:\App\CodeBlocks。
安装
1. 下载 easyx4mingw_20211002.zip 后,解压缩。
2. 将 easyx.h 和 graphics.h 拷贝到 D:\App\CodeBlocks\MinGW\x86_64-w64-mingw32\include\ 文件夹内。
3. 将 libEasyX.a 拷贝到 D:\App\CodeBlocks\MinGW\x86_64-w64-mingw32\lib\ 文件夹内。
生成项目模版
1. 创建新项目:菜单 File -> New -> Project... ,选择 Console application,点 Go 进入项目向导。语言选择 C++,项目名称 Test,路径 D:\MyDocs\(或根据自己的情况填写),编译器选择 GNU GCC Compiler,其他选项基本不用动,完成。
2. 编写基本测试代码,代码如下:
#include <graphics.h>
#include <conio.h>
int main()
{
initgraph(640, 480);
circle(320, 240, 100);
getch();
closegraph();
return 0;
}
3. 设置链接库:菜单 Project -> Build options... ,左侧选择项目名称 Test,右侧选择选项卡 Linker settings,然后在 Link libraries 逐个添加:libEasyX.a、libgdi32.a、libole32.a,完成。(这步也可以直接在 Link libraries 里面输入 -lEasyX -lgdi32 -lole32)
4. 点工具栏按钮 Build and run 或按 F9 编译执行,可以看到屏幕画出一个圆。如果这时有编译错误,请根据错误提示修正程序。
5. 生成项目模版:菜单 File -> Save project as template... ,填写模版名称:EasyX Application,完成。
6. 退出 Code::Blocks。
平时使用
创建项目模版只需要执行一次。平时创建项目时,可以在 User templates 下选择 EasyX Application,然后选择路径、项目名称,直接开始编写程序。
当然,也可以像前面创建项目模板的步骤那样从 Console application 开始。
Dev-C++ 配置 EasyX 的详细说明
以下配置说明仅以 Embarcadero 发布的官方原版 Dev-C++ 6.3 为例,下载地址:https://appzip.cn/devcpp/w ,假设 Dev-Cpp 的安装路径为 D:\App\DevCpp。
安装
1. 下载 easyx4mingw_20211002.zip 后,解压缩。
2. 将 easyx.h 和 graphics.h 拷贝到 D:\App\DevCpp\TDM-GCC-64\x86_64-w64-mingw32\include\ 文件夹内。
3. 将 libEasyX.a 拷贝到 D:\App\DevCpp\TDM-GCC-64\x86_64-w64-mingw32\lib\ 文件夹内。
生成项目模版
1. 创建新项目:菜单 File -> New -> Project... ,选择 Console application,项目名称 Test,语言选择 C++,点 OK,然后将 Test.dev 保存到 D:\MyDocs\Test\(或根据自己的情况填写),完成。
2. 编写基本测试代码,代码如下:
#include <graphics.h>
#include <conio.h>
int main()
{
initgraph(640, 480);
circle(320, 240, 100);
getch();
closegraph();
return 0;
}
3. 设置链接库:菜单 Project -> Project Options... ,选择选项卡 Parameters,然后在 Linker 区域点按钮 Add library or object 逐个添加:libEasyX.a、libgdi32.a、libole32.a,完成。(这步也可以直接在 Link libraries 里面输入 -lEasyX -lgdi32 -lole32)
4. 点工具栏按钮 Compile & run 或按 F11 编译执行,可以看到屏幕画出一个圆。如果这时有编译错误,请根据错误提示修正程序。
5. 生成项目模版:菜单 File -> New -> Project Template... ,填写模版名称:EasyX Application,其他选项可以根据自己喜好填写,完成。
6. 退出 Dev-Cpp。
平时使用
创建项目模版只需要执行一次。平时创建项目时,可以直接选择 EasyX Application,然后填写项目名称、选择路径,直接开始编写程序。
当然,也可以像前面创建项目模板的步骤那样从 Console application 开始。
常见问题
Q:我配置不好,如何确定是我本机的问题,还是库的问题?有没有封装好的给我测试一下?
A:封装好 EasyX 的 DevC++6.3 绿色版:https://pan.baidu.com/s/1qUeNEQuom_vqodhhK_fn2g (提取码:43ub)。使用方法:
- 解压到 D:\App\DevCpp 下。
- 运行 devcppPortable.exe(已设置好中文环境)。
- 创建新项目,选择 Multimedia 下面的 EasyX Application。
- 粘贴前文提到的测试代码,编译运行。
如果可以看到画出一个圆,表示库没有问题。此时,可以选择使用这个版本的 DevC++,也可以再尝试排查自己之前的配置步骤有什么问题。
注意,请使用 64 位操作系统。
Q:创建项目模版时提示错误:Unable to write to C:\Program Files (x86)\Embarcadero\Dev-Cpp\Templates\EasyX Application.template 。
A:如果将 Dev-C++ 安装到 C:\Program Files 下面,那么文件的修改是需要管理员权限的。所以,用管理员权限启动 Dev-C++,再重复创建项目模版的步骤即可。成功创建项目模版后,平时使用时,不需要管理员权限启动。
Q:编译提示错误:
undefined reference to `__imp_CreateCompatibleDC'
undefined reference to `__imp_SelectObject'
undefined reference to `__imp_DeleteObject'
undefined reference to `__imp_BitBlt'
undefined reference to `__imp_CoUninitialize'
……
collect2.exe: error: ld returned 1 exit status
或者提示错误:
EasyX.cpp:(.text+0x280): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.cpp:(.text+0x8e): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.cpp:(.text+0xcf): undefined reference to `operator delete(void*, unsigned long long)'
Image.cpp:(.text+0x67b): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.ImageFunc.cpp:(.text+0x11ba): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.GraphWnd.cpp:(.text+0x161e): undefined reference to `__imp___acrt_iob_func'
EasyX.GraphWnd.cpp:(.text+0x5ab): undefined reference to `operator delete(void*, unsigned long long)'
……
[Error] ld returned 1 exit status
A:这是 MinGW 版本太低所致,请升级 MinGW。或者升级 Dev-C++、Code::Blocks 也会附带升级 MinGW。(下个版本我会考虑适配老版本 MinGW)
Q:我以前安装过其他版本的 Dev-C++,这次严格按照教程来操作,还是有问题,请问怎么解决?
A:一些老版本的 Dev-C++ 的遗留配置文件可能会对新版本产生影响,配置文件路径为:C:\Users\[用户名]\AppData\Roaming\Dev-Cpp,将整个文件夹删掉就好。如果不好找到,就在文件管理器的地址栏输入 %APPDATA%\Dev-Cpp 敲回车,就可以自动跳转到该文件夹,删除即可。
Q:粘贴一些示例代码后,提示无法使用 _getch 函数。
A:用 getch 替代。
Q:这个库是 64 位的还是 32 位的?
A:目前我只做了 64 位的。所以,目前编译必须在 64 位系统下进行,并且 Dev-Cpp 需要编译为 64 位。下个版本我会考虑补充上 32 位的库。
Q:系统里安装了多个编译器会有影响吗?
A:很可能会。请检查编译器设置:
- 对于 Code::Blocks,菜单 Settings / Compiler...,Global compiler settings 下,Selected compiler 选择 GNU GCC Compiler,下面的 Toolchain executables 选项卡里检查一下 Compiler's installation directory,是不是 Code::Blocks 文件夹下的 MinGW。如果你的 Code::Blocks 安装路径是 D:\App\CodeBlocks,那么这里的编译器路径应该是 D:\App\CodeBlocks\MinGW。
- 对于 Dev C++ 6.3,菜单 Tools/Compiler Options...,下面的 Directories 选显卡,检查 Binaries、Libraries、C Includes、C++ Includes,是不是在 Dev C++ 的安装路径下。
Q:怎么也配置不好,找不到问题在哪,怎么解决?
A:重点检查一下“编译日志”。以官方原版 Dev-Cpp 6.3 为例,配置好之后,点击“全部重新编译”(或按 F12),然后看编译日志:
以示例中的 Dev-Cpp 6.3 环境为例,编译参数为:
g++.exe -c main.cpp -o main.o -I"D:/App/Dev-Cpp/TDM-GCC-64/include" -I"D:/App/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/include" -I"D:/App/Dev-Cpp/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/9.2.0/include" -I"D:/App/Dev-Cpp/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/9.2.0/include/c++"
g++.exe main.o -o Test.exe -L"D:/App/Dev-Cpp/TDM-GCC-64/lib" -L"D:/App/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/lib" -static-libgcc -lEasyX -lgdi32 -lole32
可以通过对照编译参数查找问题。
Q:其他问题?
A:加我 QQ:1438018116
C:\Users\刘\AppData\Local\Temp\cc5XJQP6.o 未命名1.cpp:(.text+0x33): undefined reference to `circle(int, int, int)'
C:\Users\刘\AppData\Local\Temp\cc5XJQP6.o 未命名1.cpp:(.text+0x3d): undefined reference to `closegraph()'
C:\Users\刘\Desktop\collect2.exe [Error] ld returned 1 exit status
出现编译不了的情况
球指导
[Linker error] main.o:main.cpp:(.text+0x26): undefined reference to `initgraph(int, int, int)'
[Linker error] main.o:main.cpp:(.text+0x42): undefined reference to `circle(int, int, int)'
bad reloc address 0x0 in section `.ctors'
C:\Users\奇咔咔\Desktop\C++\collect2.exe [Error] ld returned 1 exit status
C:\Users\奇咔咔\Desktop\C++\Makefile.win [Error] [new.exe] Error 1
C:\Users\刘\AppData\Local\Temp\cc5XJQP6.o 未命名1.cpp:(.text+0x33): undefined reference to `circle(int, int, int)'
C:\Users\刘\AppData\Local\Temp\cc5XJQP6.o 未命名1.cpp:(.text+0x3d): undefined reference to `closegraph()'
C:\Users\刘\Desktop\collect2.exe [Error] ld returned 1 exit status
main.o main.cpp:(.text.startup+0x27): undefined reference to `ege::initgraph(int, int, int)'
main.o main.cpp:(.text.startup+0x4b): undefined reference to `ege::circle(int, int, int, ege::IMAGE*)'
main.o main.cpp:(.text.startup+0x50): undefined reference to `ege::getch()'
main.o main.cpp:(.text.startup+0x55): undefined reference to `ege::closegraph()'
collect2.exe [Error] ld returned 1 exit status
mingw32-make *** [E:\source\C++\test\Makefile.win:26: test.exe] Error 1
这也是mingw版本低吗
id returnwd 1 exit status
D:\CodeBlocks\project\aaaaaa\main.cpp|7|undefined reference to `initgraph(int, int, int)'|
D:\CodeBlocks\project\aaaaaa\main.cpp|8|undefined reference to `circle(int, int, int)'|
D:\CodeBlocks\project\aaaaaa\main.cpp|10|undefined reference to `closegraph()'|
||error: ld returned 1 exit status|
||=== Build failed: 4 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
EasyX.cpp:(.text+0x280): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.cpp:(.text+0x8e): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.cpp:(.text+0xcf): undefined reference to `operator delete(void*, unsigned long long)'
Image.cpp:(.text+0x67b): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.ImageFunc.cpp:(.text+0x11ba): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.GraphWnd.cpp:(.text+0x161e): undefined reference to `__imp___acrt_iob_func'
EasyX.GraphWnd.cpp:(.text+0x5ab): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.DrawOnWnd.cpp:(.text+0x95): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.InputBox.cpp:(.text+0x4a): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.GlobalMemory.cpp:(.text+0x5f): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.DrawOnImg.cpp:(.text+0x606): undefined reference to `operator delete(void*, unsigned long long)'
EasyX.DrawOnImg.cpp:(.text+0x146): more undefined references to `operator delete(void*, unsigned long long)' follow
[Error] ld returned 1 exit status