在C ++中使用gRPC时无法解析的外部符号

时间:2018-10-24 13:11:43

标签: c++ visual-studio-2017 protocol-buffers grpc

Win10,Visual Studio 15 2017

这是我到目前为止所做的:

  • 克隆了grpc和来自github的子模块
  • cmake --build on grpc
  • 从我的原始文件中生成pb.cc和pb.h文件
  • grpc protobuf 添加到VC ++目录,包括目录
  • zlib grpc protobuf 添加到VC ++目录,库目录
  • 添加了 zlib.lib gpr.lib grpc.lib grpc ++。lib libprotobuf.lib 链接程序,输入,其他依赖项
  • 添加了预处理程序定义:_​​WIN32_WINNT = 0x600; NDEBUG
  • 将运行时库更改为/ MD

那之后,我的空项目(包括pb文件)被编译而没有错误。

然后我写了一些代码来使用和测试grpc,但是当我这次尝试编译时,我遇到了类似的错误

LNK2019 unresolved external symbol _address_sorting_init referenced in function "void __cdecl grpc_resolver_dns_ares_init(void)" (?grpc_resolver_dns_ares_init@@YAXXZ) grpc.lib(dns_resolver_ares.obj)  
LNK2001 unresolved external symbol __imp__htons@4 grpc.lib(socket_utils_windows.obj)    
LNK2019 unresolved external symbol _ares_gethostbyname referenced in function "struct grpc_ares_request * __cdecl grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(char const *,char const *,char const *,struct grpc_pollset_set *,struct grpc_closure *,struct grpc_lb_addresses * *,bool,char * *,struct grpc_combiner *)" (?grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked@@YAPAUgrpc_ares_request@@PBD00PAUgrpc_pollset_set@@PAUgrpc_closure@@PAPAUgrpc_lb_addresses@@_NPAPADPAUgrpc_combiner@@@Z)   grpc.lib(grpc_ares_wrapper.obj)

5 个答案:

答案 0 :(得分:1)

第一个符号“ address_sorting_init”来自https://github.com/grpc/grpc/tree/master/third_party/address_sorting上的库地址排序

第二个符号来自Windows API库“ ws2_32”,这是Microsoft的winsock库。

第三个符号来自c-ares库:https://c-ares.haxx.se/

所有3个库都是在Windows下构建grpc所必需的,因此应将它们添加到项目中。

答案 1 :(得分:0)

通过链接这些库,它对我有用(在VS2015和Win10中):

grpc++, grpc, gpr, libprotobuf, zlibstatic, ssl, crypto

最后2个位于third_party / boringssl目录中。

答案 2 :(得分:0)

第一个错误:

LNK2019 unresolved external symbol _address_sorting_init referenced in function "void __cdecl grpc_resolver_dns_ares_init(void)" (?grpc_resolver_dns_ares_init@@YAXXZ) grpc.lib(dns_resolver_ares.obj)  

可以通过添加address_sorting.lib来解决。该库与grpc ++。lib,grpc.lib和gpr.lib相同,位于grpc构建目录中。

第二个错误:

LNK2001 unresolved external symbol __imp__htons@4 grpc.lib(socket_utils_windows.obj)

可以按照Nicolas的建议通过添加ws2_32.lib来解决。

第三个错误:

LNK2019 unresolved external symbol _ares_gethostbyname referenced in function "struct grpc_ares_request * __cdecl grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(char const *,char const *,char const *,struct grpc_pollset_set *,struct grpc_closure *,struct grpc_lb_addresses * *,bool,char * *,struct grpc_combiner *)" (?grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked@@YAPAUgrpc_ares_request@@PBD00PAUgrpc_pollset_set@@PAUgrpc_closure@@PAPAUgrpc_lb_addresses@@_NPAPADPAUgrpc_combiner@@@Z)   grpc.lib(grpc_ares_wrapper.obj)

可以通过添加cares.lib来解决。您应该可以在grpc构建目录内的third_party \ cares \ cares \ lib目录下找到此lib文件,而无需从其他地方获取它。

作为总结,假设您的grpc构建目录为c:\ grpc \ .build,以下是构建发行版应用程序所需的库:

c:\grpc\.build\grpc++.lib
c:\grpc\.build\gpr.lib
c:\grpc\.build\grpc.lib
c:\grpc\.build\address_sorting.lib
c:\grpc\.build\third_party\protobuf\libprotobuf.lib
c:\grpc\.build\third_party\zlib.lib
c:\grpc\.build\third_party\cares\cares\lib\cares.lib
ws2_32.lib

如果要构建应用程序的调试版本,请首先构建grpc的调试版本,然后从grpc调试版本引用库。要使用忍者构建调试版本:

> md .debug
> cd .debug
> call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
> cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug
> cmake --build .

请根据您的Visual Studio安装更改vcvarsall.bat的以上目录。

请注意,protobuf库文件名称的Debug版本是libprotobufd.lib,而不是libprotobuf.lib。

答案 3 :(得分:0)

就我而言,我必须添加所有这些库来解决所有未解决的外部符号问题

libprotobufd.lib
gpr.lib
grpc.lib
grpc++.lib
grpc++_reflection.lib
address_sorting.lib
ws2_32.lib
cares.lib
zlibstaticd.lib
upb.lib
ssl.lib
crypto.lib
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_debugging_internal.lib
absl_demangle_internal.lib
absl_dynamic_annotations.lib
absl_examine_stack.lib
absl_exponential_biased.lib
absl_failure_signal_handler.lib
absl_flags.lib
absl_flags_config.lib
absl_flags_internal.lib
absl_flags_marshalling.lib
absl_flags_parse.lib
absl_flags_program_name.lib
absl_flags_registry.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_malloc_internal.lib
absl_periodic_sampler.lib
absl_random_distributions.lib
absl_random_internal_distribution_test_util.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_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

答案 4 :(得分:0)

我使用 conan 来构建 grpc。我发现更改 grpc conanfile 以使用 CMake install 收集所有必要的库要容易得多。 GRPC 作者为此目的维护 install 目标。

柯南工具的 collect_libs (docs) 也意味着您不必自己明确列出它们;它们被生成到道具中,然后 Visual Studio 从那里使用它们。