- 本文要严格区分app、小程序。app指的是单独运行的进程,像launcher、kdesktop。小程序则是在app中可以动态加载的一个库,它是Lua和C++混合编程,像Basic。理论上,一个app可同时加载不受数目限制的小程序。
- 为简化写法,有时把lib等同静态库,虽然android、iOS上静态库的扩展名是.a;so等同动态库,虽然Windows上动态库的扩展名是.dll。
一、包含的开源库
库 | 操作系统 | 描述 |
Boringssl | Windows、Android、iOS | 加/解密、数字安全 |
Cartographer | Windows、Android | SLAM建图,导航时定位 |
Chromium | Windows、Android、iOS | 1)处理音、视频数据外的网络任务。2)多线程 |
Openh264/Ffmpeg | Windows | H264编/解码。Android、iOS都用硬件编/解码 |
FreeRDP | Windows、Android、iOS | 远程桌面Server,远程桌面Client |
Lua | Windows、Android、iOS | 脚本语言 |
OpenCV | Windows、Android、iOS | 计算机视觉,扫描二维码 |
Protobuf | Windows、Android、iOS | 把数据结构序列化成二进制流 |
Ros | Windows、Android | 机器人节点通信,导航功能包,机械臂功能包 |
SDL | Windows、Android、iOS | 1)渲染图像、声音、字体。2)文件系统 |
TensorFlow Lite | Windows、Android、iOS | 深度学习 |
Webrtc | Windows、Android、iOS | 采集、传输视/音频 |
Rose(狭义) | Windows、Android、iOS | GUI、场景、动画。其它开源库的融合剂代码 |
因为不同操作系统有不同编译目标,这些开源库编译在哪个库,以及是lib还是so,会有不同。
Chromium、Webrtc都有初始化、结束过程,有着全局状态。它们只可被链接进app,禁止链接进小程序。
一旦编译成lib,同一进程内的app、小程序,它们各自有一套该lib的全局变量,也就是说这些全局变量是独立的。这意味着,一个须要共享全局变量的库,只能编译成so,不能编译成lib,像Ros。
只含有函数包、类包的库适合编译成lib。编译成lib优势是新版本库中接口发生改变时,不会影响旧版本,即能很好做到兼容性。
二、Windows
在Windows,用这些开源库除要生成app,还要能生成小程序。

在Viusal Studio中的项目命令时,在各库的前面加了“4lib”,像chromium.lib改为4libchromium.lib,目的是让Visual Studio在排序项目时,把这些库放在上面,app和小程序则放在下面,方便查看。
如果App不须要Ros功能,可不依赖cartographer,像kDesktop。
“Project Dependend”是指在Visul Studio的“Project Dependencies”设置的依赖关系,它会影响各项目的链接次序。举个例子要链接App,先得编译出librose.lib和cartographer.lib;要链接出librose.lib,先要编译出chromium.lib、tensorflow.lib、3rdparty2.lib、ffmpeg.dll、openh264.dll,依次类推。
对小程序,能直接使用Boringssl、Lua、OpenCV、Protobuf和Ros。但也会创建新建程,使用可等待事件,在这方面chromium、webrtc有很好解决方案,于是提供了api:create_rose_thread、rose_create_event,让小程序接间使用chromium、webrtc中的功能。
gettext放在了3rdparty.dll。原因是gettext有个存储binding链表的变量,为避免这个exe中存在多个binding链表,gettext需要编译为dll。
单独编译chromium.lib,是因为只有它需要LLVM编译器。
单独编译cartographer、tensorflowlite,是因为它们正常运行时须把优化设为“Maximum Optimization (Favor Speed) (/O2)”。等将来tensorflowlite稳定后,可能会把它们合为一个。
不能把abseil-cpp编译成dll,原因是一些函数没被dll_export。
三、Android
在Android,用这些开源库除要生成app,还要能生成小程序。

由于没了编译器、优化选项差别,chromium、cartographer、tensorflowlite都和其它库一块编译进app,即libmain.so。
和Windows一样,对小程序,能直接使用Boringssl、Lua、OpenCV、Protobuf和Ros。
四、iOS
在iOS,由于不能在运行加载动态库,用这些开源包只须生成app,不须要生成小程序。

由于没有小程序要求,所有库都和app代码汇成一个工程。