Неразрешенные внешние символы при использовании gRPC в C ++ - PullRequest
0 голосов
/ 24 октября 2018

Win10, Visual Studio 15 2017

Это то, что я сделал до сих пор:

  • клонированный grpc и субмодули из github
  • cmake --build ongrpc
  • сгенерировал файлы 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
  • изменил Runtime Library на / 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)

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Со связанными этими библиотеками это работает для меня (в VS2015 и Win10):

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

Последние 2 находятся в каталоге third_party / boringssl.

0 голосов
/ 14 мая 2019

Первая ошибка:

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, так же, как grpc ++. Lib, grpc.lib и gpr.lib.

Вторая ошибка:

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

может быть устранена путем добавления 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.Вы должны быть в состоянии найти этот файл lib в каталоге third_party \ cares \ cares \ lib внутри каталога сборки grpc, нет необходимости получать его из других источников.

В качестве резюме, предположим, что ваш каталог сборки grpc - c: \ grpc \ .build, вот библиотеки, необходимые для сборки приложения версии Release:

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

Если вы хотите создать версию приложения Debug, сначала создайте версию Debug grpc, изатем обратитесь к библиотекам из отладочной версии grpc.Чтобы создать отладочную версию с Ninja:

> 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 .

Пожалуйста, измените вышеуказанный каталог vcvarsall.bat в соответствии с вашей установкой Visual Studio.

Обратите также внимание на то, что Debug-версия файла библиотеки protobuf называетсяlibprotobufd.lib, а не libprotobuf.lib.

0 голосов
/ 24 октября 2018

Первый символ "address_sorting_init" происходит из сортировки адресов библиотеки, представленной в https://github.com/grpc/grpc/tree/master/third_party/address_sorting

Второй символ из библиотеки Windows API "ws2_32", библиотеки winsock от Microsoft.

Третий символ из библиотеки c-ares: https://c -ares.haxx.se /

Все 3 библиотеки необходимы для сборки grpc под Windows, поэтому вы должны добавить ихв ваш проект.

...