首先说明一下为什么需要自己编译一份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,CMakeWin-builds(windows编译环境神器,安装全部包就好了),Visual Studio 2015(不要问我为什么不是2017),Windows Kits(10)。当然,建议全部都下最新的。

进入protobuf目录src就是源码啦,主要修改compiler/js/js_generator.cc

修改代码片段,将原来的ParseLowerUnderscore替换为ParseUpperCamel,这里也解释了为什么user_name可以变成getUserName的形式,如下图。

好的,修改结束,开始进入编译阶段!

进入cmake目录,查看README.md得知编译步骤:

  1. 建立文件夹build/release/,并进入
  2. cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../../../../install ../.. -Dprotobuf_BUILD_TESTS=OFF

执行后,可以发现并不成功

  1. 如果提示cmake无法找到,添加cmake.exe所在文件夹到环境变量里
  2. 出现错误: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环境变量。
  3. 出现错误: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环境变量。
  4. 出现错误: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。
  5. 出现错误: Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)  ,则把 C:\Win-builds\bin、C:\Win-builds\lib64 加入LIB环境变量中。

最终输出,如下图

进入编译阶段:同目录下执行nmake,可能出现如下错误:

  1. 出现错误: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,测试导出,符合预期。

发表评论

电子邮件地址不会被公开。 必填项已用*标注