# xos **Repository Path**: helloworldghh/xos ## Basic Information - **Project Name**: xos - **Description**: xos跨平台库 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-11 - **Last Updated**: 2026-04-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # xos ## 概述 ----------------- ### c++跨平台解决方案 xos是为了解决c++跨平台开发时,遇到的各平台特性不同,导致代码各种问题的基础库。 1、各平台api不同,导致代码要用宏来区分。 2、各平台编译方式不同 3、依赖,最讨厌的各种依赖。 ### 设计哲学 对于盖房子,有两种哲学: #### unix哲学 提供沙粒,理论上可以建设任意结构样子的房子,提供了足够的灵活性。但问题是,太累。 #### java哲学 提供结构件,可以快速的盖房子,但要遵守结构件的约束,并且无法盖出超出结构件允许范围的房子。 #### 两种哲学的比较 其实两种哲学并无差异,是一样的。只是,它们默认的基础地基不同。unix哲学的地基,就是c++的基本类型,对于工具之间的交流,则是基于文本;这当然是绝对安全可靠的地基,但是,由于粒度太细,导致效率太低。 现在我们需要思考一下,我们需要什么样的地基? 先说答案吧:1、足够稳定。2、足够通用。3、效率高 地基并不意味着粒度必须足够细,足够底层。比如,我们每天出行,并不是采用最原始的步行,比如我想从南京去北京,一般不会采用步行的方式。步行显然是最细粒度的地基了,但效率太低,于是我们会采用汽车、高铁、飞机等方式。 为什么我们愿意采用这些现代化方式,而不是原始的步行呢?效率当然是重要原因,但能够长期稳定的使用才是关健。试想,如果汽车会经常熄火,火车会随意脱轨,而飞机经常掉下来,你还会乘坐吗?显然不会。 所以地基必须足够稳定。 通用是必须的。但真的完全通用又是难的,通用的前题是,必须承认一些假设。当然通用的前题假设必须少,并且足够必要。 #### 关于地基的结论 1、不必细粒度 2、足够稳定 3、足够通用 4、效率高 ## 原理 ![](doc/image/xoskit_overview.png)
图1: xos原理
## 特点 1、如图所示,统一定义平台层接口,各平台分别实现 2、各平台以动态库的二进制模块实现。模块使用手动载入方式,不使用隐式加载方式。 3、所有第三方库,都以静态库的形式编译进二进制模块 4、使用时,只需要接口定义头文件,及二进制模块 5、提供融合所有二进制模块的管理模块,它负责载入所有模块 6、提供初始载入管理模块的跨平台代码 7、平台对外再无任何依赖 8、支持的平台:windows,各种linux及安卓,mac及ios。安卓需要自己安装ndk ## 结构 ![](doc/image/xoskit_struct.png)
图1: xos结构
这个图中的aio网络模块,已经移入了core模块中,因为无论如何,它都是平台相关,因为iocp,epoll,kqueue是平台相关的。 如你所见,xos_container模块的作用就是把所有功能接口集中导出来。 红色线框的xos_aio和xos_core是平台相关的,代码每个平台一份,各不相同。其它模块的代码只有一份。 模块作用就不说了,因为是能看得出来的。 xos_sqlite没有实现,因为我没用过它。只是一个空架子放那了。 ## 例子 看例子最容易理解。xos\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当中包括了所有功能接口。有了它,就可以使用xos的所有功能了。 ## 更好的例子 [cat - 可以用c++开发网站了](https://gitee.com/helloworldghh/cat) 我使用这个跨平台库,实现的c++ web后端开发框架: 0、最重要的是,这个项目有可以运行的二进制发布包。我会尽量把各平台的二进制包都发布出来。 1、全异步,servlet插件化,支持类jsp模板,编译为jsp模块,自动压缩。。。 2、真正的热升级。http host中的所有文件都支持热升级,包括:普通文件和二进制动态库插件。 3、实现了真正的共享复制栈协程,数据库及一切需要异步的操作,都可以同步化 4、完全可以用c++开发web后端。并不复杂。 5、详细请移步过去细看。 ## 编译 1、[本项目源码](https://gitee.com/helloworldghh/xos)。 2、依赖项目: (1)[extlibs1](https://gitee.com/helloworldghh/extlibs1), [extlibs2](https://gitee.com/helloworldghh/extlibs2),第三方静态库 (2)[xmake](https://gitee.com/helloworldghh/xmake),编译框架。没有使用cmake之类 (3)[xstl](https://gitee.com/helloworldghh/xstl),对象池,无锁队列等模板功能库 (4)[win10](https://gitee.com/helloworldghh/win10),[win11](https://gitee.com/helloworldghh/win11),平台定义,只是一个文件一个宏。因为我发现在win11下vld不好用,win10下好用,所以引入了一个平台定义文件来区分。下到本地,名称改成win (5)[tools](https://gitee.com/helloworldghh/tools),内有vld,mingw,及msys中在windows下可用的linux工具,这可以让windows下可以使用make系列工具,实现一体化编译,只有windows需要,把msys工具添加到系统path路径中。 (6)[slns](https://gitee.com/helloworldghh/slns),编译管理部分,内有win下的vs2022 sln,及跨平台编译入口makefile.只是为了方便一次性编译各模块,可以不用;但用了会更方便。 3、 目录结构 your_dir/xos your_dir/cat your_dir/extlibs1 your_dir/extlibs2 your_dir/xmake your_dir/xstl your_dir/win your_dir/tools your_dir/slns 4、编译方法 (1)windows有2种编译方式 1、进入xos/xos_sln,直接使用sln编译 2、进入xos/xos_makefile,用:make CFG=x64 [G=debug|release] -j6 3、这个makefile编译方式,其实使用的还是vs2022的工程。需要在xmake/xmake/configs/x64中配置:MSBuild:=C:/UserProgram/vs/2022/Enterprise/MSBuild/Current/Bin/MSBuild.exe (2)mingw 1、需要自己安装msys及mingw环境。 2、在mingw64环境下,进入xos/xos_makefile,用:make CFG=mingw [G=debug|release] -j6 (3)各种linux,android,mac,ios.... 1、在对应环境下,进入xos/xos_makefile,用:make CFG=[linux|mac|android_arm64|android_armv7|android_x64|ios_arm64|ios_x64] [G=debug|release] -j6 5、 输出目录 your_dir/build build目录下,会有: [platform][BIN][debug|release] [platform][InterMediaFiles][按项目源码目录组织的临时文件] 各平台的编译输出模式一样,都在这里。 我为了加快速度,将win下的build目录设置为链接,指向了内存磁盘。使用ssd的人不需要,我是机械硬盘... linux下建议将它指向/tmp目录下的目录,使用内存。 6、写文档很痛苦,我肯定没有说明白。但使用真的很方便。