EasyX,全名:“EasyX Graphics Library for C++”。由于其采用静态编译,并不依赖任何 dll,超低的学习成本,深受许多开发者喜欢,在下面列举一些 EasyX 的特点:
EasyX 具有如此多的优点,但是在早期仅支持 MVSC 编译器。对于使用 GNU/Linux 发行版的开发的开发者来说造成很多的困扰。终于,在 2022 年 6 月 10 号,EasyX 提供适配 MinGW 的 库文件,从这开始 EasyX 正式支持使用 minGW 编译器,这就为使用 GNU/Linux 开发的开发者提供切入点!
CLion 是由 JetBrains 出品的专门为开发 C 以及 C++ 所设计的跨平台集成开发环境(IDE)。其以 IntelliJ 为基础设计,包含许多智能功能来提高开发者的生产力。同时其强大的跨平台能力使之 CLion 能够在 GNU/Linux、OS X 和 Windows 上开发 C 和 C++。
注意:在这里笔者仅仅以 CLion 为 IDE 开发环境开发 EasyX,但同时在 VScode 上也能成功开发 EasyX。其根本是 EasyX 支持使用 MinGW 编译器,与所使用的 C/C++ 开发工具无关。
那么接下来就开始学习如何通过 MinGW 与 CLion 使用 EasyX 吧!
假如所使用的 GNU/Linux 发行版为 Debian 系,及 Debian、Ubuntu 等,则可直接使用以下命令安装 MinGW 编译器。
sudo apt-get update
sudo apt-get install mingw-w64
若您使用的是其他 GNU/Linux 发行版,则可以参考 MinGW 官网「MinGW」
MinGW,即 “Minimalist GNU for Windows”。译为适用于 Windows 的极简主义 GNU。
它是一个可自由使用和自由发布的 Windows 特定头文件和使用 GNU 工具集导入库的集合,允许在 GNU/Linux 和 Windows 平台生成本地的 Windows 程序而不需要第三方 C 运行时(C Runtime)库。[1]
简单来说:它实际上是将经典的开源 C 语言编译器 GCC 通过添加 Windows 独有的头文件、Win32 API 等其他集合,从而移植到 Windows 上。使之在 Windows 上也可以使用 GCC。
在这里,我们使用 MinGW-w64 编译器,区别于过去的只能编译 32 位可执行文件的 MinGW。MinGW-w64 既可编译 32 位可执行文件也可编译 64 位可执行文件。[2] 现如今使用的 MinGW 已经被 MinGW-w64 所取代, 所以在下面笔者所述的 MinGW 皆为 MinGW-w64。
MinGW 特点
那么在上一步我们已经成功安装了 MinGW,该如何去使用它呢?
CLion 工具链简介:
对于 CLion 中的 CMake 项目,工具链是构建和运行应用程序所需的所有必要工具的集合:工作环境,CMake 可执行文件,make 和编译器以及调试器。
您始终可以为一个项目拥有多个工具链,并在需要时在它们之间轻松切换。
当您开始使用 CLion 时,您已经有了默认的工具链。尽管可以在开发中使用它,但您可能还需要根据项目需要调整工具集(例如,更改工作环境或切换到其他编译器)。[4]
首先,我们需要去 /usr/bin
目录下寻找一下两个程序:
如果成功找到,那么接下来笔者将通过在 CLion 上设置 MinGW 工具链的方式在 CLion 上使用 MinGW。
如图:
解释:
1、首先点击 “+” 创建新的工具链
2、将工具链名设置为 “mingw”
3、设置 C/C++ 编译器,如图所示。
注意:
在 CLion 中已经自带有构建工具 ninja、CMake 和调试器 GDB。如果读者在其他开发环境使用,如 nvim、VScode 等,需要自行安装。在接下来的使用中会用到上文程序。
CMake 简介:
CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装 (编译过程)。
他能够输出各种各样的 makefile 或者 project 文件,能测试编译器所支持的 C++ 特性, 类似 UNIX 下的 automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。
这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。[5]
解释:
1、首先如上文步骤一样,点击 “+” 创建新的 CMake
2、修改 CMake 文件名
3、修改工具链,在 GNU/Linux 下默认使用 gcc,这里使用在上文构建的工具链。
至此,我们已经在 CLion 上做好的 MinGWd 的基础环境配置。那么开始码代码吧:)
注意:在接下来所介绍的 CMake 使用皆为依据笔者所使用的 CMakeList 文件内容,简单介绍 CMake 命令。若想要深入理解 CMake,可以阅读「CMake Reference Documentation」,望见谅。
首先,我们在 CLion 新建项目,其基本结构如下:
解释:
第一项:在 CLion 官方文档下描述为 “在这里指定生成的 CMake 文件所需的位置”。在原生的 CMake 编译下通过 CMakeLists.txt 文件生成 CMakeFile 等一系列文件,CLion 则直接将其汇合为一个文件夹 “Build directory”。注意:这里仅代表 CLion,若在 VScode 下使用则还需更加深入了解 CMake 工作原理。
第二项:为 CMake 配置文件
了解了,基本项目架构,那么我们便开始简单解释 CMake 工作原理吧!
首先,我们打开 CMakeLists.txt
文件,其原生内容(这里指 CLion 初始化内容)如下:
cmake_minimum_required(VERSION 3.24)
project(Test)
set(CMAKE_CXX_STANDARD 17)
add_executable(Test main.cpp)
解释:
第一项参数:cmake_minimum_required
,原意为 “cmake 最低要求”。指在您所构建的环境下,cmake 所使用版本必须大于或等于您所设置的 cmake 版本。
第二项参数:project
指的是该项目名,注意该项参数很重要。后续许多命令都会使用该参数。
第三项参数:set
作用是用来给变量设置值。变量一般分为三种:
- 一般变量
- 缓存变量
- 环境变量
在这里我们通过
set()
命令设置 C++ 标准为 C++17
第四项参数:add_executable
原意为 “添加可执行文件”,作用为:使用指定的源文件来生成目标可执行文件。这里 CLion 自动生成 main.cpp 文件,并设置运行 / 调试程序名为 Test(即是前面说设置的 project 项目名)
其次,我们再来看看 main.cpp
文件:
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
这仅一个生成 “Hello,World!” 的简单代码。
我们关注其生成原理:
在 CLion 中,我们只需点击 “绿色三角形按键” 即可。
若使用命令行方式,这执行:
cmake .
make
./Test
具体过程:
$ ls
CMakeLists.txt main.cpp
$ cmake .
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: ~/Downloads
$ make
[50%] Building CXX object CMakeFiles/Test.dir/main.cpp.o
[100%] Linking CXX executable Test
[100%] Built target Test
$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake CMakeLists.txt main.cpp Makefile Test
$ ./Test
Hello, World!
即可得到 “Hello World!” O(∩_∩)O 哈哈~
OK!,我们已经成功通过 cmake 编译生成 C++ 可执行文件了,那么我们开始进阶操作吧!↖(^ ω ^)↗
我们分别在 Test
项目目录下创建以下文件夹:
解释:
bin:bin 是 Binaries (二进制文件) 的缩写,用于存放 cmake 编译源代码生成的可执行文件。
include:用于存放 C++ 头文件
lib:lib 是 library(库文件)的缩写,用于存放库文件,比如我们之后需要使用的 “libeasyx.a” 静态链接库
src:src 是 source(源文件) 的缩写,用于存放源文件。
注意:不设置这些文件,依旧可以使用 cmake 编译源文件,但是为了项目的完整性和可持续发展,笔者建议读者尽量遵守项目开发基本规则。
创建结果如下:
首先,我们需要安装的是「easyx-for-mingw」。目前,截止到现在(2023.2.13)最新的版本为 20220901。点击这里下载 easyx4mingw_20220901
下载完成,我们可以看到 easyx 文件夹内具体内容为:
├── include
│ ├── easyx.h // 头文件(提供当前最新版本接口)
│ └── graphics.h // 头文件(在 easyx.h 基础上,保留若干旧接口)
├── lib32
│ └── libeasyx.a // 针对 TDM-GCC 4.8.1 及以上版本的 32 位库文件
├── lib64
│ └── libeasyx.a // 针对 TDM-GCC 4.8.1 及以上版本的 64 位库文件
├── lib-for-devcpp_5.4.0
│ └── libeasyx.a // 适用于 DevCpp 5.4.0 GCC MinGW 4.7.2 和 C-Free 5.0
└── readme.txt
将 easyx.h
和 graphics.h
分别拷贝到我们之前新建项目的 include
目录,如果您想要使用 64 位的库文件,则将 libeasy.a
文件拷贝到 lib
目录,同理,使用 32 位库文件一样。
至此,EasyX 已经安装完成,下面便是最重要的 CMakeLists 配置!
注意:
在接下来,笔者仅以自己的配置为例,如果读者想要实现其他功能,则参考「CMake Reference Documentation」。
配置如下:
cmake_minimum_required(VERSION 3.24)
project(Test)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
link_directories(${PROJECT_SOURCE_DIR}/lib)
set(SOURCES
src/main.cpp
)
#------------------------------------
add_executable(Test ${SOURCES})
target_link_libraries(Test easyx)
target_include_directories(Test
PRIVATE
${PROJECT_SOURCE_DIR}/include
)
解释:
前三项我们已经解释了,那么从第四项开始吧
set()
命令的用法我们已经介绍过了,简单来说就是为变量赋值。
i. 命令set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
用意就是让 cmake 采用静态编译的方式,否则单纯运行 exe 文件并不能运行。有关静态编译命令的简介可看「cmake 静态编译 简介」
ii. 命令SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
作用:设置bin
目录为可执行文件存放目录,其中${PROJECT_SOURCE_DIR}
表示项目目录,即上文设置的Test
项目目录。
iii. 命令link_directories(${PROJECT_SOURCE_DIR}/lib)
作用为为 cmake 提供存放库文件存放目录的地址,即上文设置的lib
目录。
iv. 命令:set(SOURCES src/main.cpp )
表示将 src 下所有文件共用一个名字
SOURCES
,这样后面我们如果再想要添加新的源文件,可以直接接着src/main.cpp
写,比如:笔者希望添加test.cpp
源文件,这可以这么写:set(SOURCES src/main.cpp src/test.cpp )
但是,请注意:一个
SOURCES
下只能存在一个main
程序。接着往下看:
v. 命令add_executable(Test ${SOURCES})
,作用在上文我们说过,这里我们直接将src
目录下所有源程序都使用一个运行 / 调试程序Test
来运行,提高开发效率。
vi. 命令target_link_libraries(Test easyx)
,target_link_libraries
命令用来链接导入库,即按照 header file + .a + .so 方式隐式调用动态库的. a 库。详细介绍可以查看官方文档 「target_link_libraries」
注意:
target_link_libraries
必须用在add_executable
之后。
使用该命令对应的库文件名是相对随意的,cmake 会自动去寻找您存放在项目下的 lib 文件。
比如:# 链接 libeasyX.so 库 # 以下写法都可以: target_link_libraries(Test easyx) target_link_libraries(Test libeasyx.a) # 显示指定链接静态库 target_link_libraries(Test libeasyx.so) # 显示指定链接动态库,这里只是作比较,其实并没有 libeasyx.so 动态库 # 再比如: target_link_libraries(Test libeasyx.so) target_link_libraries(Test easyx) target_link_libraries(Test -leasyx)
vii. 命令:
target_include_directories(Test PRIVATE ${PROJECT_SOURCE_DIR}/include )
为 cmake 提供头文件存放位置,该命令类似于上面的
target_link_libraries
。其中用到了关键词PRIVATE
,除此之外还有INTERFACE
、PUBLIC
。
OK!, 很棒 \(^ o ^)/YES!
我们总算可以开始使用 EasyX 库了!
开始吧!
首先,我们还是从代码出发吧!
我们修改 main.cpp
文件中的内容为:
#include<graphics.h>
#include<conio.h>
int main()
{
initgraph(666, 666); // 初始化为 666*666 的画布
/* circle */
setcolor(BLUE); //circle 的线条为蓝色
setfillcolor(RED); //circle 内红色填充
setbkcolor(GREEN);
fillcircle(100, 100, 20); //circle center 为(100,100)半径 20
getch(); // 按任意键继续
closegraph(); // 关闭图形界面
return 0;
}
解释:
这里笔者仅仅只是通过绘画出一个圆的方式,来简单使用 EasyX 库。
如果在 CLion 中出现:
我们可以通过 wine
程序运行该 exe
文件。
运行结果如下:
解释:
笔者使用的操作系统为 ==Deepin==,所以笔者使用的wine
为deepin-wine6-stable
,当然 Debian 系也可以直接通过sudo apt update && sudo apt install wine
安装wine
。至于其他操作系统笔者并未接触,望谅解。
可以通过查看「WineHQ」,获得最新的wine
。
感谢社区开发者AaronLi的贡献