返回

Protobuf第二弹

该章节讲述Protocol工具的生成

Protoc.exe工具

在上一章节,我们了解到Protoc工具可以将.Proto文件转换成C#脚本,但是我们使用的是开发者编译好的protocol工具,对于我们来说它是一个黑盒,如果我们想了解内部过程,或修改内部编译方法怎么办呢。

CMake

什么是CMake

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

以上来着百度词条,看起来不太好理接,毕竟看我博客的应该没有多少CPP开发者。通俗点说,CMake是一个跨平台编译工具,它可以生成不同的IDE(开发环境),只要有源码和cmake的描述文件CMakeLists.txt,cmake就能自动生成各种各样IDE的工程文件,如果你们小组有人用vs写的习惯,有人用eclipse写的习惯,这个时候cmake就起作用了(但是貌似没有公司允许小组开发用多个IDE的),反正作用就是这样,跨IDE。

CMake和Protocol关系

Proto作者在开发时考虑到开发者可能使用不同的平台开发环境(Win/Linux),所以在工具的生成过程集成到了CMake中,方便不同平台的开发者使用。

CMake还原Protocol源码

1.准备CMake与Protocol

进入CMake官网下载CMake

在Proto官方GitHub下载Protobuf包protobuf-csharp-3.10.1.zip,注意下载的不是protoc、而是protobuf

2.CMake还原设置

  1. 将protobuf解压,并在文件夹中新建一个vs文件夹,用于存放编译后的Protocol源码

  2. 打开CMake,配置编译路径(Proto解压目录下的cmake文件夹),与输出路径(新建的vs文件夹)

  3. 点击Configure,配置如下编译条件,点击Finish

  4. 等待系统配置完成,会跳出如下界面,注意图中的选项栏,如果勾上会编译为动态库,这里我们不要勾选。然后点击Generate

    库有两种:静态库(.a、.lib)和动态库(.so、.dll)

    一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。静态库特点总结:

    • 静态库对函数库的链接是放在编译时期完成的。

    • 程序在运行时与函数库再无瓜葛,移植方便。

    • 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

    动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新

    • 动态库把对一些库函数的链接载入推迟到程序运行的时期。
    • 可以实现进程之间的资源共享。(因此动态库也称为共享库)
    • 将一些程序升级变得简单。
    • 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

    更直观来说,引用动态库exe程序想要运行,需要将库文件dll一起拷贝,而引用静态库的exe程序运行,只需要这个exe程序即可。

  5. 用VS打开vs文件夹下的*.sln文件。

  6. 右击解决方案下protoc项目,选择重新生成。等待编译完成后,再次右击,选择在文件资源管理器中打开。在Debug文件夹下,我们就可以看到我们编译好的protoc.exe程序。

  1. 如果第4步使用的是静态库编译,这里直接将protoc.exe文件拷贝走就可以使用了,如果是动态库,需要将下面选中的dll文件一起拷贝使用。

C#生成源码部分查看

在Protocol的源代码中使用VS的搜索功能,在整个解决方案下搜索using scg = global::System.Collections.Generic;。定位到的csharp_reflection_class.ccCPP文件就是针对C#代码写入脚本。