Я пытаюсь сгенерировать клиента gRP C в C ++, и сгенерированный клиентский код встроен в проект Visual Studio 2015 DLL. По какой-то причине при построении сгенерированного клиента gRP C в DLL происходит кратера sh при выполнении запроса gRP C, однако при построении сгенерированного клиента gRP C в stati c lib этого не происходит.
У меня есть воспроизводимый пример, который можно найти здесь . Пример содержит сервер для запуска в папке Dependencies\GreetServer
и два проекта C ++:
GrpcDllTestClient
содержит событие сборки, которое использует protoc.exe
для генерации клиентского кода из файл прото внутри Dependnecies\GreetServer
. Выполнение команды protoc.exe
можно найти в скриптах powershell GenerateGrpcClient.ps1
. Сгенерированный код клиента (файлы .h и. cc) автоматически включается для сборки.
GrpcDllTestClientHarness
- это исполняемый проект, который ссылается на GrpcDllTestClient
и использует сгенерированный gRP C клиентский код, доступный из GrpcDllTestClient
для запуска запросов.
В примере содержатся две конфигурации сборки Visual Studio. Debug
создает GrpcDllTestClient
как DLL, которая является конфигурацией, в которой происходит cra sh, DebugAsLib
создает клиентский проект как stati c lib, который не вызывает cra sh.
Когда происходит cra sh, я вижу следующий стек вызовов:
> GrpcDllTestClientHarness.exe!gpr_atm_no_barrier_fetch_add(int * p, int delta) Line 101 C++
GrpcDllTestClientHarness.exe!grpc_core::CallCombiner::SetNotifyOnCancel(grpc_closure * closure) Line 189 C++
GrpcDllTestClientHarness.exe!grpc_call_unref(grpc_call * c) Line 604 C++
GrpcDllTestClientHarness.exe!grpc_impl::ClientContext::~ClientContext() Line 70 C++
Я установил gRP C, используя vcpkg
со следующими параметрами:
set(VCPKG_TARGET_ARCHITECTURE x86)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_PLATFORM_TOOLSET v140)
Эти опции позволяют vcpkg создавать библиотеки gRP C как stati c libs, ориентируясь на компилятор Visual Studio 2015.
Любая идея, почему нужно создавать сгенерированный клиент gRP C внутри DLL вызывает cra sh, если клиент используется извне DLL? Я рад go с опциями stati c lib, но мне интересно узнать, сталкивался ли кто-нибудь с этой проблемой раньше и есть ли обходной путь.