首先说明一下为什么需要自己编译一份Protobuf Compiler。在项目中由于使用protobuf3的js导出,再由js转成lua版本。js导出代码在名字上有使用上的痛点。举个例子:
message LoginRequest { string userName = 1; string password = 2; }
js导出的方法为getUsername()和getPassword(),我想你已经发现了,结构成员userName应该变成getUserName才更好更方便使用。那么可以变成我们想要的格式吗?可以,但是proto需要调整一下:
message LoginRequest { string user_name = 1; string password = 2; }
调整过后,java导出和js都是驼峰形式了,但是写proto就比较难受了,特别是对于cv proto党来说。综上,于是开始尝试修改Protobuf Compiler中js导出代码,重新编译。
如题,使用protobuf 3.6.1,github官方直接下载,解压。
接下来我们开始一些准备工作:
安装git,CMake,Win-builds(windows编译环境神器,安装全部包就好了),Visual Studio 2015(不要问我为什么不是2017),Windows Kits(10)。当然,建议全部都下最新的。
进入protobuf目录src就是源码啦,主要修改compiler/js/js_generator.cc
修改代码片段,将原来的ParseLowerUnderscore替换为ParseUpperCamel,这里也解释了为什么user_name可以变成getUserName的形式,如下图。
好的,修改结束,开始进入编译阶段!
进入cmake目录,查看README.md得知编译步骤:
- 建立文件夹build/release/,并进入
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../../../../install ../.. -Dprotobuf_BUILD_TESTS=OFF
执行后,可以发现并不成功
- 如果提示cmake无法找到,添加cmake.exe所在文件夹到环境变量里
- 出现错误:The CMAKE_C_COMPILER: cl is not a full path and was not found in the PATH. ,则把C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin 加入Path环境变量。
- 出现错误:RC Pass 1: command “rc /foCMakeFiles\cmTC_f62e3.dir/manifest.res CMakeFiles\cmTC_f62e3.dir/manifest.rc” failed (exit code 0) with the following output:系统找不到指定的文件。 ,则把C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86 加入Path环境变量。
- 出现错误:LINK : fatal error LNK1104: 无法打开文件“kernel32.lib” ,则把 C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x86 加入LIB环境变量。同理需要C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x86、C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib。
- 出现错误: Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR) ,则把 C:\Win-builds\bin、C:\Win-builds\lib64 加入LIB环境变量中。
最终输出,如下图
进入编译阶段:同目录下执行nmake,可能出现如下错误:
- 出现错误:fatal error C1083: 无法打开包括文件: “corecrt.h”: No such file or directory ,添加以下目录到 INCLUDE 环境变量中:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include、C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared、C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt、C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um、C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\winrt、C:\Win-builds\include。
最后出现:
大功告成!文件就在当前目录下protoc.exe,测试导出,符合预期。