文章目录
  1. 前言
  2. CMAKE
  3. 理解CMakeList

前言

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
2
3
4
5
6
7
8
9
____________________________________________________________
| _________ __________ ______________ |
| |网络库 | |数据库 | | 消息队列 | |
| |________| |_________| |_____________| |
| |
| ___________ ____________ ____________ |
| |RPC框架 | |配置文件 | | 序列化 | |
| |__________| |___________| |___________| |
|___________________________________________________________|

WebSocketClient类对应网络库

Connection类与Indexer类对应数据库

(Ev)MessageQueue类对应消息队列

Preferences类对应配置文件

ISerializableQuery对应序列化(只是对nlohmann::json类的封装)

分析RPC实现的原理(callback)