上周研究了一下Protobuf与Grpc的编译,新版本的Protobuf与Grpc依赖了不少Google的库,尤其是其中一个叫 abseil-cpp 的库所包含的lib文件达90多个,使用体验不是太好,不是必须要使用的话,不建议用。
已将编译好的Protobuf + grpc 库(包含proto编译工具、各种依赖库)上传至 csdn资源,不打算自己编译的同学可以直接下载。
grpc编译起来有点费劲,主要是依赖的库太多,而且其使用的boringssl编译起来更是有不少问题,最难受的是编译时候需要访问golang的网页,在国内不翻墙是无法访问的。
我这边编译的是grpc-1.65.4版本,所使用的第三方库主要有如下几个(附版本信息):
abseil-cpp-20240722.0
benchmark-1.8.5
boringssl-flips-20220613
c-ares-1.33.0
googletest-1.15.2
protobuf-27.3
re2-2024-07-02
zlib-1.3.1
将依赖的第三方库拷贝到grpc的third_party子目录下对应的文件目录,在grpc更目录下创建build目录,由于此级已经存在一个名为Build的文件了,需要换个名字,我这里是build-dir。在build-dir目录下打开命令行工具执行cmake .. ,顺利的话会生成Visual Studio工程,不过第一次总是会有些挫折的,有一些错误需要解决。
第三方库boringssl编译需要安装一些工具:Perl、Nasm、golang。将这些工具安装好,配置好环境变量,再执行cmake .. 命令。这会应该是能够生成 Visual Studio工程了,用IDE打开工程进行编译,不出意外的话还是会报一些错误。我下面列举下我编译过程遇到的错误以及解决方式供参考。
boringssl 中crypto编译错误,由于此工程编译需要访问golang的网页获取某些文件来生产 err_data.c 文件,没有翻墙工具的同学通常是无法完成的,我这里找另外一个有翻墙工具的同事帮忙生成了此文件,不过每次编译时候还要先失败一次,这时会在 grpc/build-dir/third_party/boringssl-with-bazel/crypto 目录下生成一个err_data.c 的文件,用准备好的err_data.c文件替换它再次编译即可。已将err_data.c文件上传至csdn资源,如果计划使用源码编译,又没有翻墙工具的同学,可以下载使用。
尽管如此,boringssl的子项目crypto_test还是会编译失败,其中引用的一个 GetTestData 函数连接失败,不过此项目不影响grpc的使用,将其忽略即可。另外由于boringssl 中要使用的 Nasm.exe去生成一些东西,再使用 /MTd的方式编译时,调用Nasm.exe 的命令会多一个 /MTd 的参数,导致调用失败,于是我只编译了/MDd版本。
引用boringssl的include目录路径错误,在 grpc/cmake/ssl.cmake 文件中设置的,此文件中设置的是 set(_gRPC_SSL_INCLUDE_DIR ${BORINGSSL_ROOT_DIR}/src/include),但是boringssl中是没有src目录的,把此处的src去掉即可。
目前我这边编译情况是除了 crypto_test 工程编译失败,其它工程都编译成功了。这时选中Install 工程,右键生成,会把编译好的可执行程序、库及头文件安装到 grpc/install 目录下。
在生成grpc文件时,官网仅给了linux下的命令:
$ protoc -I ../../protos --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` ../../protos/route_guide.proto
$ protoc -I ../../protos --cpp_out=. ../../protos/route_guide.proto
在windows下各种报错,一度怀疑是protobuf与grpc版本兼容的问题,折腾了多个版本,简直想放弃。最后调试源码后慢慢弄懂一些,--plugin=protoc-gen-grpc是作为一个整体,
而protoc-gen-grpc是使用 "protoc-" + "gen-" 以及 "--grpc_out" 中的grpc拼凑起来的,所以--plugin=protoc-gen-grpc 是没错的,但是"="后面的`which grpc_cpp_plugin`是不对的,在windows下得改成 grpc_cpp_plugin.exe
所以在windows下生成grpc文件的命令是:
$ protoc.exe -I ../../protos --grpc_out=. --plugin=protoc-gen-grpc=grpc_cpp_plugin.exe ../../protos/route_guide.proto
$ protoc.exe -I ../../protos --cpp_out=. ../../protos/route_guide.proto
贴一下测试项目中依赖的库,方便后续拷贝使用:
absl_bad_any_cast_impl.lib
absl_bad_optional_access.lib
absl_bad_variant_access.lib
absl_base.lib
absl_city.lib
absl_civil_time.lib
absl_cord.lib
absl_cord_internal.lib
absl_cordz_functions.lib
absl_cordz_handle.lib
absl_cordz_info.lib
absl_cordz_sample_token.lib
absl_crc_cord_state.lib
absl_crc_cpu_detect.lib
absl_crc_internal.lib
absl_crc32c.lib
absl_debugging_internal.lib
absl_decode_rust_punycode.lib
absl_demangle_internal.lib
absl_demangle_rust.lib
absl_die_if_null.lib
absl_examine_stack.lib
absl_exponential_biased.lib
absl_failure_signal_handler.lib
absl_flags_commandlineflag.lib
absl_flags_commandlineflag_internal.lib
absl_flags_config.lib
absl_flags_internal.lib
absl_flags_marshalling.lib
absl_flags_parse.lib
absl_flags_private_handle_accessor.lib
absl_flags_program_name.lib
absl_flags_reflection.lib
absl_flags_usage.lib
absl_flags_usage_internal.lib
absl_graphcycles_internal.lib
absl_hash.lib
absl_hashtablez_sampler.lib
absl_int128.lib
absl_kernel_timeout_internal.lib
absl_leak_check.lib
absl_log_entry.lib
absl_log_flags.lib
absl_log_globals.lib
absl_log_initialize.lib
absl_log_internal_check_op.lib
absl_log_internal_conditions.lib
absl_log_internal_fnmatch.lib
absl_log_internal_format.lib
absl_log_internal_globals.lib
absl_log_internal_log_sink_set.lib
absl_log_internal_message.lib
absl_log_internal_nullguard.lib
absl_log_internal_proto.lib
absl_log_severity.lib
absl_log_sink.lib
absl_low_level_hash.lib
absl_malloc_internal.lib
absl_periodic_sampler.lib
absl_poison.lib
absl_random_distributions.lib
absl_random_internal_distribution_test_util.lib
absl_random_internal_platform.lib
absl_random_internal_pool_urbg.lib
absl_random_internal_randen.lib
absl_random_internal_randen_hwaes.lib
absl_random_internal_randen_hwaes_impl.lib
absl_random_internal_randen_slow.lib
absl_random_internal_seed_material.lib
absl_random_seed_gen_exception.lib
absl_random_seed_sequences.lib
absl_raw_hash_set.lib
absl_raw_logging_internal.lib
absl_scoped_set_env.lib
absl_spinlock_wait.lib
absl_stacktrace.lib
absl_status.lib
absl_statusor.lib
absl_str_format_internal.lib
absl_strerror.lib
absl_string_view.lib
absl_strings.lib
absl_strings_internal.lib
absl_symbolize.lib
absl_synchronization.lib
absl_throw_delegate.lib
absl_time.lib
absl_time_zone.lib
absl_utf8_for_code_point.lib
absl_vlog_config_internal.lib
address_sorting.lib
cares.lib
crypto.lib
gpr.lib
grpc.lib
grpc++.lib
libprotobufd.lib
re2.lib
ssl.lib
upb_base_lib.lib
upb_json_lib.lib
upb_mem_lib.lib
upb_message_lib.lib
upb_textformat_lib.lib
utf8_range.lib
utf8_range_lib.lib
utf8_validity.lib
zlibstaticd.lib