商务型网站有哪些,邯郸做移动网站多少钱,商标设计一般多少钱,济南做网站本人菜鸟#xff0c;文中若有代码、术语等错误#xff0c;欢迎指正 我写的项目地址#xff1a;https://github.com/liujianjie/GameEngineLightWeight#xff08;中文的注释适合中国人的你#xff09; 文章目录前言关键操作代码文件关键代码代码流程代码文件关键代码exter… 本人菜鸟文中若有代码、术语等错误欢迎指正 我写的项目地址https://github.com/liujianjie/GameEngineLightWeight中文的注释适合中国人的你 文章目录前言关键操作代码文件关键代码代码流程代码文件关键代码extern外部定义CreateApplication包含头文件条件编译和宏定义实现Dll导入与导出代码流程运行效果Github涉及的C知识前言 此节目的 将上一小节的main函数入口点写在Hazel项目中由引擎内部控制。 优化dll导出导入代码用条件编译宏定义来编写dll导出与导入代码 Cherno本节完整代码链接 https://github.com/TheCherno/Hazel/commit/f9fbbd2bf3d870a6586c5c4f70a867d78e27b113
关键操作 Hzel项目 右键属性(所有配置)C/C预处理器预处理器定义 输入 HZ_PLATFORM_WINDOWS;HZ_BUILD_DLL Sandbox项目 右键属性(所有配置)C/C预处理器预处理器定义 输入 HZ_PLATFORM_WINDOWS; 右键属性(所有配置)C/C常规附加包含目录 输入 $(SolutionDir)Hazel\src 为了Sandbox项目能引入Hazel项目的文件 #include Hazel.h代码文件关键代码代码流程
代码文件 Hazel项目 Application类 引擎内部功能实现 Core.h 来根据不同项目的条件编译而写dll导入还是导出的宏定义 EntryPoint.h 入口点main函数 Hazel.h 引入其它头文件控制给Sandbox项目提供哪些引擎内部功能 Sandbox项目 SanboxApp.cpp 应用层实现
关键代码
extern外部定义CreateApplication 在Hazel项目的Application.h中 namespace Hazel {class HAZEL_API Application{....};// To be defined in CLIENTApplication* CreateApplication();
}在Hazel命名空间内声明了CreateApplication函数 在Sandbox项目的SandboxApp.cpp中 Hazel::Application* Hazel::CreateApplication()
{return new Sandbox();
}定义了CreateApplication函数 在EntryPoint.h中调用 extern Hazel::Application* Hazel::CreateApplication();
int main(int argc, char** argv){auto app Hazel::CreateApplication();...
}将CreateApplication函数声明为extern表示此函数会在外部定义接下来使用的这函数时将使用在外部定义的CreateApplication
包含头文件条件编译和宏定义实现Dll导入与导出 在Core.h中 #pragma once
#ifdef HZ_PLATFORM_WINDOWS#ifdef HZ_BUILD_DLL#define HAZEL_API __declspec(dllexport)#else#define HAZEL_API __declspec(dllimport)#endif
#else#error Hazel only supports Windows!
#endif根据条件编译定义HAZEL_API是dll导入还是导出由上的关键操作小点可知Hazel项目将是__declspec(dllexport)Sandbox项目是__declspec(dllimport) 问题在于这关Sandbox项目何事这明明是Hazel项目中的头文件 由于Sandbox#include Hazel.h而Hazel项目的Hazel.h包含了Application.hApplication.h又包含了Core.h文件 所以这Core.h的代码也会被拷贝到Sandbox项目的SandboxApp.cpp中#include Hazel.h的位置 并且Application.h也会被拷贝到Hazel.h的位置。 #include Hazel.h
class Sandbox : public Hazel::Application
{
public:Sandbox(){}~Sandbox(){}
};
.....所以Sandbox项目也有HAZEL_API宏定义且是__declspec(dllimport) 所以SandboxApp.cpp的代码将变成 #pragma once
#ifdef HZ_PLATFORM_WINDOWS#ifdef HZ_BUILD_DLL#define HAZEL_API __declspec(dllexport)#else#define HAZEL_API __declspec(dllimport)#endif
#else#error Hazel only supports Windows!
#endif
namespace Hazel {class HAZEL_API Application// HAZEL_API被替换成__declspec(dllimport){public:Application();virtual ~Application();void Run();};// To be defined in CLIENTApplication* CreateApplication();
}
....省略EntryPoint.h的代码下面将运行流程会有....
class Sandbox : public Hazel::Application
{
public:Sandbox(){}~Sandbox(){}
};
.....所以Sandbox类导入了dll中的Application类且可以继承Application。 对应003节的代码 #pragma once
namespace Hazel {_declspec(dllexport) void Print();// 导出
}namespace Hazel {_declspec(dllimport) void Print(); // 导入
}
void main() {Hazel::Print();// 使用
}代码流程 开始运行Sandbox.exe 由于Sandbox中#include Hazel.h而Hazel项目的Hazel.h包含了Application.h和EntryPoint.h入口文件 Hazel.h #pragma once
// For use by Hazel applications
#include iostream
#include Hazel/Application.h
// ---Entry Point---------------------
#include Hazel/EntryPoint.h
// -----------------------------------EntryPoint.h定义了main函数即写了入口点所以程序会在这运行 因为SandboxApp.cpp在第一行包含Hazel.hHazel.h又包含EntryPoint.h那么EntryPoint.h的代码会被拷贝到SandboxApp.cpp中 #include Hazel.h将拥有以下EntryPoint.h中的代码 #pragma once
#ifdef HZ_PLATFORM_WINDOWS
extern Hazel::Application* Hazel::CreateApplication();
int main(int argc, char** argv)
{std::cout Core::main std::endl;auto app Hazel::CreateApplication();app-Run();delete app;
}
#endifmain函数中执行CreateApplication函数将调用定义在SandboxApp.cpp中的CreateApplication函数 Hazel::Application* Hazel::CreateApplication()
{return new Sandbox();
}这函数返回的指针是Hazel项目中的Application父类指针所以auto app的类型是Application*。 当执行app-Run()函数时由于Run()函数没有声明为虚函数所以会调用Application中的Run()函数 #include Application.h
namespace Hazel {Application::Application(){}Application::~Application(){}void Application::Run(){while (true);}
}Application的Run函数是一个while循环所以循环会无限制运行中
运行效果 需要把最新生成的Hazel.dll放在Sandbox.exe文件夹下 Github .gitignore 在.git文件夹下新建.gitignore文件可以声明一些不想提交到暂存区的文件 # Binaries
**/bin/
bin-int/# Visual Studio files and folder
.vs/
**.sln
**.vcxproj
**.vcxproj.filters
**.vcxproj.user
**.csproj其它命令 git add *// 提交文件到暂存区
git reset . // 将暂存区文件返回
git status // 查看文件有无提交到暂存区状态
git commit -m 注释// 将暂存区的内容添加到仓库
git push origin main // 将本地的分支版本上传到远程并合并涉及的C知识
对应此节代码地方
Hazel::Application* Hazel::CreateApplication()
{return new Sandbox();
}
auto app Hazel::CreateApplication();
app-Run();转换为以下容易理解的代码
#include iostream
using namespace std;class Application {
public:void Run() {cout Application::Run() endl;}
};
class Sandbox : public Application {
public:void Run() {cout Sandbox::Run() endl;}
};
void main() {Application* app new Sandbox();app-Run();// 由于Run()函数没有声明为virtual虚函数所以执行父类的Run函数
}