在发行版配置上使用gRPC C ++时出现链接器错误

时间:2019-06-24 15:14:33

标签: c++ nuget grpc

我已经使用github上的官方说明从源代码编译了grpc库。 我已经使用cmake调用MSVC v142构建工具(Visual Studio 2019),并生成了两个构建配置,一个用于Release,一个用于Debug。 根据构建工件以及gRPC库的包含文件,我创建了一个C ++ NuGet包。该NuGet软件包同时使用了Release版本和Debug构建工件(当然,它们也将它们放置在每种配置类型的指定文件夹中)。 我已经通过构建的NuGet软件包创建了一些“ Hello World”应用程序,该应用程序在Windows上使用了gRPC库。 (这只是一个标准示例,可以在gRPC官方示例中找到,没有添加任何新内容)。 在“ Hello World”应用程序的Debug版本上,一切工作正常-编译,链接,执行和调试,但是当我切换到Release上的项目进行编译时,我遇到了7个与缺少函数定义有关的链接器错误。

有关如何从源代码构建gRPC的指令来自此处:“ https://github.com/grpc/grpc/blob/master/BUILDING.md”。 我搜索了在gRPC源代码上实现的那些函数在哪里,发现它在“ grpc ++”项目中,该项目被编译为“ grpc ++。lib”。我已经检查了该文件是否确实包含在我的nuget包中,并且配置正确(发布)和体系结构(x64)。 我检查了是否确实将正确的配置和体系结构作为NuGet程序包的输入,甚至尝试不使用我创建的NuGet程序包直接链接到这些二进制文件。

这是使用Release x64构建时的链接器输出:

1>------ Build started: Project: HelloGrpc++NuGet, Configuration: Release x64 ------
1>HelloWorldServer.cc
1>HelloWorldServer.obj : error LNK2001: unresolved external symbol "class std::shared_ptr<class grpc::ServerCredentials> __cdecl grpc::InsecureServerCredentials(void)" (?InsecureServerCredentials@grpc@@YA?AV?$shared_ptr@VServerCredentials@grpc@@@std@@XZ)
1>HelloWorldServer.obj : error LNK2001: unresolved external symbol "public: __cdecl grpc::ServerBuilder::ServerBuilder(void)" (??0ServerBuilder@grpc@@QEAA@XZ)
1>HelloWorldServer.obj : error LNK2001: unresolved external symbol "public: virtual __cdecl grpc::ServerBuilder::~ServerBuilder(void)" (??1ServerBuilder@grpc@@UEAA@XZ)
1>HelloWorldServer.obj : error LNK2001: unresolved external symbol "public: virtual class std::unique_ptr<class grpc::Server,struct std::default_delete<class grpc::Server> > __cdecl grpc::ServerBuilder::BuildAndStart(void)" (?BuildAndStart@ServerBuilder@grpc@@UEAA?AV?$unique_ptr@VServer@grpc@@U?$default_delete@VServer@grpc@@@std@@@std@@XZ)
1>HelloWorldServer.obj : error LNK2001: unresolved external symbol "public: class grpc::ServerBuilder & __cdecl grpc::ServerBuilder::RegisterService(class grpc::Service *)" (?RegisterService@ServerBuilder@grpc@@QEAAAEAV12@PEAVService@2@@Z)
1>HelloWorldServer.obj : error LNK2001: unresolved external symbol "public: class grpc::ServerBuilder & __cdecl grpc::ServerBuilder::AddListeningPort(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::shared_ptr<class grpc::ServerCredentials>,int *)" (?AddListeningPort@ServerBuilder@grpc@@QEAAAEAV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$shared_ptr@VServerCredentials@grpc@@@4@PEAH@Z)
1>D:\Users\abiton\Desktop\grpcsandbox\HelloGrpc++NuGet\bin\x64\Release\HelloGrpc++NuGet.exe : fatal error LNK1120: 6 unresolved externals
1>Done building project "HelloGrpc++NuGet.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这是使用gRPC C ++库的可执行代码(标准示例,我什么也没添加):

#include <iostream>
#include <memory>
#include <string>
#include <grpc++/grpc++.h>
#include "src/server/helloworld.grpc.pb.h"

using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using helloworld::HelloRequest;
using helloworld::HelloReply;

class GreeterServiceImpl final : public helloworld::Greeter::Service
{
    Status SayHello(ServerContext* context, const HelloRequest* request, HelloReply* response) override
    {
        response->set_message("Hello from GRPC Server !");
        return Status::OK;
    }
};

int main(int argc, char** argv)
{
    std::string server_address("0.0.0.0:50051");
    GreeterServiceImpl service;

    ServerBuilder builder;
    // Listen on the given address without any authentication mechanism.
    builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
    // Register "service" as the instance through which we'll communicate with
    // clients. In this case it corresponds to an *synchronous* service.
    builder.RegisterService(&service);
    // Finally assemble the server.
    std::unique_ptr<Server> server(builder.BuildAndStart());
    std::cout << "Server listening on " << server_address << std::endl;

    // Wait for the server to shutdown. Note that some other thread must be
    // responsible for shutting down the server for this call to ever return.
    server->Wait();
    return 0;
}

这些是添加到我的示例项目中的其他包含目录的相对路径:

grpc\include
grpc\third_party\protobuf\src

这些是构建工件的相对路径:

grpc\.build\Release
grpc\.build\third_party\cares\cares\lib\Release
grpc\.build\third_party\protobuf\Release
grpc\.build\third_party\zlib\Release

这些是链接器输入:

address_sorting.lib
cares.lib
gpr.lib
grpc.lib
grpc++.lib
grpc++_unsecure.lib
libprotobuf.lib
zlib.lib

任何帮助将不胜感激!

0 个答案:

没有答案