Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
建筑生成的C++;gRPC客户端进入DLL会在发出请求时导致崩溃 我试图在C++中生成GRPC客户端,并在VisualStudio 2015 DLL项目中生成生成的客户端代码。出于某种原因,在DLL中构建生成的gRPC客户端时,发出gRPC请求时会发生崩溃,但在静态库中构建生成的gRPC客户端时不会发生_C++_Protocol Buffers_Grpc_Vcpkg - Fatal编程技术网

建筑生成的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

我有一个可复制的例子,可以找到。该示例包含在RealStices \ GrutServer < /C>文件夹中运行的服务器,以及两个C++项目:

  • GrpcDllTestClient
    包含一个生成事件,该事件使用
    protoc.exe
    dependencies\GreetServer
    中的proto文件生成客户端代码。运行
    protoc.exe
    的命令可以在powershell脚本
    generategrpclient.ps1
    中找到。生成的客户端代码(.h和.cc文件)将自动包含在生成中

  • GrpcDllTestClientHarness
    是一个exe项目,它引用
    GrpcDllTestClient
    ,并使用从
    GrpcDllTestClient
    公开的生成的gRPC客户端代码来触发请求

该示例包含两个Visual Studio生成配置
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将是存根暴露的地方。