建筑生成的C++;gRPC客户端进入DLL会在发出请求时导致崩溃 我试图在C++中生成GRPC客户端,并在VisualStudio 2015 DLL项目中生成生成的客户端代码。出于某种原因,在DLL中构建生成的gRPC客户端时,发出gRPC请求时会发生崩溃,但在静态库中构建生成的gRPC客户端时不会发生
我有一个可复制的例子,可以找到。该示例包含在建筑生成的C++;gRPC客户端进入DLL会在发出请求时导致崩溃 我试图在C++中生成GRPC客户端,并在VisualStudio 2015 DLL项目中生成生成的客户端代码。出于某种原因,在DLL中构建生成的gRPC客户端时,发出gRPC请求时会发生崩溃,但在静态库中构建生成的gRPC客户端时不会发生,c++,protocol-buffers,grpc,vcpkg,C++,Protocol Buffers,Grpc,Vcpkg,我有一个可复制的例子,可以找到。该示例包含在RealStices \ GrutServer < /C>文件夹中运行的服务器,以及两个C++项目: GrpcDllTestClient包含一个生成事件,该事件使用protoc.exe从dependencies\GreetServer中的proto文件生成客户端代码。运行protoc.exe的命令可以在powershell脚本generategrpclient.ps1中找到。生成的客户端代码(.h和.cc文件)将自动包含在生成中 GrpcDllTe
包含一个生成事件,该事件使用GrpcDllTestClient
从protoc.exe
中的proto文件生成客户端代码。运行dependencies\GreetServer
的命令可以在powershell脚本protoc.exe
中找到。生成的客户端代码(.h和.cc文件)将自动包含在生成中generategrpclient.ps1
是一个exe项目,它引用GrpcDllTestClientHarness
,并使用从GrpcDllTestClient
公开的生成的gRPC客户端代码来触发请求GrpcDllTestClient
Debug
将GrpcDllTestClient
构建为DLL,这是发生崩溃的配置,DebugAsLib
将客户端项目构建为静态库,不会导致崩溃
当崩溃发生时,我可以看到以下调用堆栈:
> 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++
我已使用带有以下选项的vcpkg
安装了gRPC:
set(VCPKG_TARGET_ARCHITECTURE x86)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_PLATFORM_TOOLSET v140)
这些选项使vcpkg将gRPC库构建为静态库,目标是Visual Studio 2015编译器
你知道为什么在DLL内部构建生成的gRPC客户端会导致崩溃吗?如果客户端是从DLL外部使用的?我很乐意使用静态的lib选项,但有兴趣知道是否有人以前遇到过这个问题,如果有一个解决办法。我不理解这个句子<代码>如果客户机是使用在DLL >你的意思是<代码>外部< /代码>?@ Landstalker -生成的C++存根是在DLL项目内部构建的,并通过工厂向DLL项目的任何使用者公开。如果检查提供的示例,ClientFactory将是存根暴露的地方。