musikcube项目概述
文章目录
前言
muscikcube其实还不算大型的项目,但即便如此,不理清它的结构,看起来还是很头疼的!
本文使用的是muscikcube目前的最新版本—0.97.0;下载源码解压,根目录下的文件如下。
1 | CHANGELOG.txt CMakeLists.txt CONTRIBUTORS.txt LICENSE.txt musikcube.sln musikcube.spec README.md script src |
源码在src目录下,有如下文件
1 | 3rdparty core_c_demo musikcore musikcube musikcubed musikdroid musikwin plugins |
根据名字也很容易猜出来:
- 3rdparty 使用的第三方库
- musikcore muscikcube的核心功能
- musikcube muscikcube的客户端
- musikcubed musikcube的服务端
- musikwin musikcube适配Windows系统额外增加的代码
- musikdroid musikcube适配安卓系统额外增加的代码
- plugins 插件(后面会具体讲)
当然,本项目有CMakeLists.txt,那么这才是理解此项目最有效的切入点,但是在此之前需要学习cmake的语法。
CMAKE
1 | set 将普通的、缓存的或环境变量设置为给定值 |
1 | include 可用于包含cmake的模块,便于之后调用模块中的方法;也可用于包含.cmake目录下的cmake脚本 |
1 | message 输出信息 |
1 | include_directories 指定查找头文件的目录,可简化源文件中要包含的头文件的路径 |
1 | find_package 找到一个包(通常由项目外部的东西提供),并加载其包特定的细节 |
1 | find_library 此命令用于查找库 |
1 | add_subdirectory 将子目录添加到build中,将执行子目录下的CMakeLists.txt |
1 | add_dependencies 在顶级目标之间添加依赖关系 |
更多信息参考cmake官方文档
理解CMakeList
从CMakeList.txt中我们可以看出
- musikcube与musikcubed依赖于musikcore
- plugins中的文件夹各自编译出对应的动态链接库,musikcubed在初始化时将其加载
接下来介绍一些重要的类(Preferences、PluginFactory、Connection、Indexer、ISerializableQuery、LibraryFactory(LocalLibrary与RemoteLibrary)、EvMessageQueue、PlaybackService、WebSocketClient),以及命名空间plugin中的函数,弄清楚了这些类与函数,也就基本上理解了这个项目。
通常,一个C++网络编程项目的标准框架如下
1 | ____________________________________________________________ |
WebSocketClient类对应网络库
Connection类与Indexer类对应数据库
(Ev)MessageQueue类对应消息队列
Preferences类对应配置文件
ISerializableQuery对应序列化(只是对nlohmann::json类的封装)
分析RPC实现的原理(callback)