xoskit
概述
c++跨平台解决方案
xoskit是为了解决c++跨平台开发时,遇到的各平台特性不同,导致代码充满宏定义,难以维护问题的。
原理
图1: xoskit原理
特点
各平台分别实现接口功能
各平台的接口实现,编译为模块
模块采用动态库形式。这是因为静态库虽然可以编译进程序,编译时却要链接一堆有关无关的库,实难管理
模块导出一个create方法,用来创建管理者接口
管理者接口可以创建模块内所有功能接口
除了基本跨平台功能,xoskit也提供了程序开发需要的其它功能
xoskit引入了一些常用库,并以静态库的形式封装编译进了xoskit的动态库。
xoskit保存了常用库在各平台上的静态库文件,方便编译xoskit。但这导致了xoskit项目很庞大。带来的好处是,xoskit对外界没有任何依赖,使用极其方便。
使用接口带来的一个好处是,没有编译依赖,只要包含了接口文件就可以编译。
结构
图1: xoskit结构
如你所见,xos_container模块的作用就是把所有功能接口集中导出来。
红色线框的xos_aio和xos_core是平台相关的,代码每个平台一份,各不相同。其它模块的代码只有一份。
模块作用就不说了,因为是能看得出来的。
xos_sqlite没有实现,因为我没用过它。只是一个空架子放那了。
例子
看例子最容易理解。xoskit\example是一个载入所有接口的例子。这个例子也是跨平台的。
核心代码:
xos_container::i_container * container_ptr = 0;
void * xos_module = 0;
xos_container::f_create fun = 0;
int ret = 0;
if( 0 == ret )
{
ret = xos_helper::xos_load_and_get( ( void ** )&fun,
xos_module,
0,
"xos_container",
"create" );
}
if( 0 == ret )
{
ret = fun( &container_ptr );
}
xos_stl::release_interface( container_ptr );
xos_helper::xos_free( xos_module );
xos_container::i_container当中包括了所有功能接口。有了它,就可以使用xoskit的所有功能了。
更好的例子
现在没人用c++开发网站,是因为没有好的框架。我试着写了一个这样的框架,使用c++开发网站,就类似于用java的servlet,jsp,struts2。
缺点
xoskit要求使用者用它的接口来写程序,这样原来基于系统接口的c++代码是没法用xoskit的。也很难修改过来,只有新开发的项目才能用xoskit。其实c++本身就是跨平台的,只要弥合了平台的一点差异,比如线程,文件,同步方法,网络等,跨平台开发还是不难的。
求助
xos_encrypt模块用了openssl静态库,我自认为使用方法没错,可是它总是有内存泄漏,vld可以看出来。我没办法查出原因,请了解的人教我。
编译
编译输出目录结构
比如我的build输出目录是这样:
D:\vmware\c++\develop\build\Win32\BIN\U_D_MD
D:\vmware\c++\develop\build\Win32\BIN\U_R_MT
D:\vmware\c++\develop\build\Win32\InterMediaFiles\各项目的临时文件
D:\vmware\c++\develop\build\x64\BIN\U_D_MD
D:\vmware\c++\develop\build\x64\BIN\U_R_MT
D:\vmware\c++\develop\build\x64\InterMediaFiles\各项目的临时文件
D:\vmware\c++\develop\build\linux\BIN\U_D_MD
D:\vmware\c++\develop\build\linux\BIN\U_R_MT
D:\vmware\c++\develop\build\linux\InterMediaFiles\各项目的临时文件
...
其它平台也类似。
windows
直接用vs,我开发用的是vs2015,如果你也用这个版本的话,可以直接打开sln编译:D:\vmware\c++\develop\xoskit\xos_sln\vs_2015.sln。debug时,要先编译一下xos_makefile,它只是帮助把其它项目需要的vld拷到输出目录。
用makefile。windows上,也和其它平台一样,可以使用makefile.用的是ndk带的一个make.exe工具。makefile文件和其它平台共用的。需要先设置一下环境:
把D:\vmware\c++\develop\xoskit\xos_lib\tools加到系统path中,这里有ndk的make.exe工具和帮助运行dos命令的工具tool.exe。dos命令不接受/格式的路径,没了tool.exe,makefile是跑不起来的。
编译win32,用vs的VS2015 x86 Native Tools Command Prompt进入dos,转到D:\vmware\c++\develop\xoskit\xos_makefile目录,运行命令:make OS=win32 [G=-g]
编译x64,用vs的VS2015 x64 Native Tools Command Prompt进入dos,转到D:\vmware\c++\develop\xoskit\xos_makefile目录,运行命令:make OS=x64 [G=-g]
可以看到,xoskit\xos_makefile目录下有各平台的编译变量定义文件。
其它平台
因为要分目录输出,所以其它平台都定义了平台名称,编译时要输入平台名称,比如make os=(win32|x64|linux|linux64|mac|ios_static|ios_simulator|android)
编译每个平台代码时,我没做交叉编译,要用这个平台的环境。比如编译mac下的代码,要用苹果系统的编译环境,make OS=mac [G=-g]。
G=-g表示编译调试版本,不加G宏定义,编译release版本。