Post

开发工具小货车

开发工具小货车

van

最近有点想搞一个跨平台的编译工具链,在有想法时候,可以像游戏引擎一样,编写业务逻辑,进行跨平台发布。

为啥不利用现有的游戏引擎?现有的游戏引擎太重了,有很多不相关的模块,还有unity这种账号强绑定的引擎,相当不方便,我想搞一个简单点的。

先简单记录一下技术链,使用xmake作为跨平台的构建工具,sdl作为跨平台窗口以及输入解决方案,bgfx作为跨平台的渲染底层,imgui作为UI解决方案,并作为一个独立的模块可卸载。

van为业务开发程序入口,负责业务代码编译以及模拟运行。
在业务开发完成后,导出到各个平台的时,会由xmake将业务代码编译为对应平台的动态库,然后再由对应平台的一个入口工程进行进行再次编译,并链接业务动态库,这里主要也由xmake进行主导,根据不同的平台可能有一些其他的处理方式。

c++动态库加载

在C++中,动态加载库(也称为共享库或动态链接库,如.so在Linux/Unix系统上或者.dll在Windows上)依赖于操作系统提供的API。以下是一些基本步骤和API的使用示例:

在Linux/Unix系统上:

使用dlopen, dlclose, dlsym等函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 #include <dlfcn.h>
 
 // 打开动态库
 void* handle = dlopen("libexample.so", RTLD_LAZY);
 if (!handle) {
     // 处理错误: 使用dlerror()获取错误信息
 }
 
 // 获取函数指针
 typedef void (*func_t)();
 func_t func = (func_t)dlsym(handle, "function_name");
 const char* dlsym_error = dlerror();
 if (dlsym_error) {
     // 处理错误: dlsym_error中包含错误信息
     dlclose(handle);
 }
 
 // 使用函数
 func();
 
 // 关闭动态库
 dlclose(handle);

在Windows系统上:

使用LoadLibrary, FreeLibrary, GetProcAddress等函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 #include <windows.h>
 
 // 加载动态库
 HMODULE hModule = LoadLibrary(TEXT("example.dll"));
 if (!hModule) {
     // 处理错误
 }
 
 // 获取函数指针
 typedef void (*func_t)();
 func_t func = (func_t)GetProcAddress(hModule, "function_name");
 if (!func) {
     // 处理错误
     FreeLibrary(hModule);
 }
 
 // 使用函数
 func();
 
 // 释放动态库
 FreeLibrary(hModule);

在上述两段代码中,你首先使用dlopenLoadLibrary加载动态链接库,之后使用dlsymGetProcAddress根据函数名获取函数指针。最后在不再需要该库时,使用dlcloseFreeLibrary来卸载动态链接库。

请注意,传递给dlopenLoadLibrary的库文件路径可能需要是绝对路径,或者确保库文件在应用程序的搜索路径中。另外,类型转换是必要的,因为dlsymGetProcAddress返回的是一个void*类型的函数指针,你需要将其强制转换为正确的函数类型才能调用。

在实践中还需要处理错误和异常情况,确保即使在出现错误时,资源也能被正确释放。在使用动态链接库的过程中正确的错误处理是非常重要的。

This post is licensed under CC BY 4.0 by the author.