Встраивание сгенерированного клиента C ++ gRP C в DLL приводит к cra sh при выполнении запросов - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь сгенерировать клиента 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, но мне интересно узнать, сталкивался ли кто-нибудь с этой проблемой раньше и есть ли обходной путь.

...