一. 空模板创建项目
创建一个C++空项目gRPC_Server, 本例使用Debug模式编译
二、拷贝项目文件
拷贝文件到gRPC_Server所在的目录中
- D:\GRPCProject\gRPC_Project\grpc\examples\protos 中 helloworld.proto
- D:\GRPCProject\gRPC_Project\grpc\examples\cpp\helloworld中greeter_client.cc 和 greeter_server.cc
- D:\GRPCProject\gRPC_Project\grpc_install\bin 中 proto.exe 和 zlibd.dll
- D:\GRPCProject\gRPC_Project\grpc\.build\Debug 中 grpc_cpp_plugin.exe
三. 生成pb文件
cmd中输入如下命令,生成4个pb文件:
protoc.exe --grpc_out=. --plugin=protoc-gen-grpc=grpc_cpp_plugin.exe helloworld.proto
protoc.exe --cpp_out=. helloworld.proto
四. 设置项目属性
把文件关联到项目中:
拷贝相关依赖包,使得项目能够独立运行:
- 创建文件夹depends, 子文件grpc 和 third_party
- 将D:\GRPCProject\gRPC_Project\grpc\include 和 D:\GRPCProject\gRPC_Project\grpc\third_party\protobuf\src 拷贝到 grpc文件中去
- 将下面文件夹中文件拷贝到third_party目录中:
D:\GRPCProject\gRPC_Project\grpc\.build\Debug
D:\GRPCProject\gRPC_Project\grpc\.build\third_party\cares\cares\lib\Debug
D:\GRPCProject\gRPC_Project\grpc\.build\third_party\zlib\Debug
D:\GRPCProject\gRPC_Project\grpc\.build\third_party\protobuf\Debug
4.1 【c/c++】-【常规】-【附件包含目录】
D:\GRPCProject\gRPC_Project\gRPC_Server\gRPC_Server\depends\grpc\include
D:\GRPCProject\gRPC_Project\gRPC_Server\gRPC_Server\depends\grpc\protobuf\src
4.2 【c/c++】-【预处理器】-【预处理器定义】
添加:_WIN32_WINNT=0x0A00
4.3 【链接器】-【常规】-【附加库目录】
D:\GRPCProject\gRPC_Project\gRPC_Server\gRPC_Server\depends\third_party
4.4 【链接器】-【输入】-【附加依赖项】
libprotobufd.lib
grpc.lib
grpc++.lib
gpr.lib
Ws2_32.lib
zlibd.lib
cares.lib
address_sorting.lib
五. 编译项目
1.报错:E1696 无法打开 源 文件 "absl/synchronization/mutex.h",意思是缺少相关的头文件,进行头文件的添加。
解决:复制D:\GRPCProject\gRPC_Project\grpc\third_party\abseil-cpp下的文件到grpc.
然后【c/c++】-【常规】-【附件包含目录】
2.再次点击运行,报错为:LNK2001 无法解析的外部符号 "public: __cdecl absl::Mutex::~Mutex(void)"
意思是:缺少头文件依赖的文件函数
解决:把D:\GRPCProject\gRPC_Project\grpc_install\lib路径下所以的lib文件拷贝到grpc third_party中,【链接器】-【输入】-【附加依赖项】中添加所以拷贝过去的文件名。
文件名太多,不想一个个复制,用python进行获取文件名:
import os
num = 0
for filename in os.listdir(r"D:\GRPCProject\gRPC_Project\grpc_install\lib"):
if filename.endswith(".lib"):
num += 1
print(filename)
print(num)
获取的文件名为:
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_cordz_functions.lib
absl_cordz_handle.lib
absl_cordz_info.lib
absl_cordz_sample_token.lib
absl_cord_internal.lib
absl_debugging_internal.lib
absl_demangle_internal.lib
absl_examine_stack.lib
absl_exponential_biased.lib
absl_failure_signal_handler.lib
absl_flags.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_leak_check.lib
absl_leak_check_disable.lib
absl_log_severity.lib
absl_low_level_hash.lib
absl_malloc_internal.lib
absl_periodic_sampler.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_strerror.lib
absl_strings.lib
absl_strings_internal.lib
absl_str_format_internal.lib
absl_symbolize.lib
absl_synchronization.lib
absl_throw_delegate.lib
absl_time.lib
absl_time_zone.lib
address_sorting.lib
cares.lib
crypto.lib
gpr.lib
grpc++.lib
grpc++_alts.lib
grpc++_error_details.lib
grpc++_reflection.lib
grpc++_unsecure.lib
grpc.lib
grpcpp_channelz.lib
grpc_plugin_support.lib
grpc_unsecure.lib
libprotobuf-lited.lib
libprotobufd.lib
libprotocd.lib
re2.lib
ssl.lib
upb.lib
zlibd.lib
zlibstaticd.lib
文件名添加后,重新运行,成功!