# 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、效率高
## 原理

图1: xos原理
## 特点
1、如图所示,统一定义平台层接口,各平台分别实现
2、各平台以动态库的二进制模块实现。模块使用手动载入方式,不使用隐式加载方式。
3、所有第三方库,都以静态库的形式编译进二进制模块
4、使用时,只需要接口定义头文件,及二进制模块
5、提供融合所有二进制模块的管理模块,它负责载入所有模块
6、提供初始载入管理模块的跨平台代码
7、平台对外再无任何依赖
8、支持的平台:windows,各种linux及安卓,mac及ios。安卓需要自己安装ndk
## 结构

图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、写文档很痛苦,我肯定没有说明白。但使用真的很方便。