1 简介
本文讲解如何基于premake5创建一个典型的C++解决方案,该解决方案包含三个项目:
- 一个依赖GLFW动态库的动态库项目ExampleDll
- 一个依赖ExampleDll动态库的窗口程序APP
- 一个基于Catch的单元测试程序UnitTest
所有代码已上传Github,链接。
2 你需要准备
- premake5.exe程序
- 一个文本编辑器
- 一个支持C++11的编译器,因为源代码使用了C++11特性
- 一个支持OpenGL 1.1的显卡
3 文件的组织结构
首先需要确定整个解决方案中源代码、三方库、二进制等文件的组织结构,本文创建的文件结构如下:
premakeExample/
|–premake5.lua (premake脚本文件)
|–prj/ (生成的解决方案与各项目配置文件路径)
|–build/
| |–target/ (目标生成路径)
| |–obj/ (中间文件生成路径)
|–bin/ (最终发布的二进制文件路径)
|–3rd/ (第三方库文件路径)
| |–Catch (Catch单元测试框架头文件路径)
| |–glfw (glfw三方库相关文件路径)
4 下载所需文件
本文以64位系统为例,需下载64位二进制库,也可以下载32位,但要记得在后面lua脚本中改变architecture配置。
将下载解压后的include和
lib-vc*
文件夹放在premakeExample/3rd/glfw文件夹下,*
指代不同的vs版本,需与后续生成配置文件的vs版本一致。
将lib-vc*路径下的glfw3.dll拷贝纸premakeExample/bin路径下
- catch是一个只有头文件的依赖库,将Catch.hpp(下载)放在premakeExample/3rd/Catch/include路径下即可。
5 添加代码
5.1 ExampleDll
ExampleDll库只是对glfw中的GLFWwindow进行了简单封装,隐藏了window的内部实现细节。Window类通过_declspec(dllexport)
导出。
ExampleDll.hpp代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct GLFWwindow;
namespace ExDLL
{
class _declspec(dllexport) Window
{
public:
Window(int width, int height, const std::string& title);
~Window();
bool shouldClose() const noexcept;
void pollEvents() const noexcept;
void swapBuffers() const noexcept;
std::pair<int, int> getWindowSize() const noexcept;
private:
GLFWwindow* wnd;
};
}ExampleDll.cpp代码如下
1 |
|
5.2 App
应用程序依赖Exampledll,创建一个窗口应用程序,并运用固定管线绘制一个红色的三角形。当然本教程不讲解OpenGL,如果想要学习OpenGL的使用,应该学习更先进的可编程管线。
- main.cpp代码如下:
1 |
|
5.3 UnitTest
单元测试程序检查创建的窗口大小是否与参数要求的大小一致。
- Test.cpp代码如下:
1 |
|
6 编写premake5.lua脚本文件
premake5.lua是生成工程配置文件的核心。
- premake5.lua代码如下:
1 | -- 最终解决方案的名称 |
7 生成工程文件并编译
premake5.exe运行时时会寻找调用命令路径下的premake5.lua文件,如果想生成工程配置文件,需在premakeExample路径下调用premake5.exe <action>
,其中action
可指定为vs2019
或gmake
,本文以vs2019为例。
执行命令后在prj文件夹下,生成的工程配置文件如下:
打开premakeExample.sln编译解决方案,在bin路径下运行app.exe,效果如下:
命令行打开单元测试程序UnitTests.exe,效果如下: