Ошибки компоновщика при использовании gRPC C ++ при конфигурации выпуска - PullRequest
0 голосов
/ 24 июня 2019

Я скомпилировал библиотеку grpc из исходного кода, используя официальные инструкции на github.Я использовал cmake для вызова инструментов сборки MSVC v142 (Visual Studio 2019) и сгенерировал две конфигурации сборки, одну для выпуска и одну для отладки.Из артефактов сборки и из включаемых файлов библиотеки gRPC я создал пакет C ++ NuGet.Этот пакет NuGet использует как Release, так и артефакты сборки Debug (и, конечно, помещает их в назначенную папку для каждого типа конфигурации).Я создал приложение «Hello World», которое использует библиотеку gRPC в Windows, с помощью пакета NuGet, который я создал.(Это просто стандартный пример, который можно найти на официальных примерах gRPC, ничего нового не было добавлено).В отладочной сборке приложения «Hello World» все работает просто отлично - компиляция, компоновка, выполнение и отладка, но когда я переключаюсь на компиляцию проекта в Release, у меня 7 ошибок компоновщика, связанных с отсутствующими определениями функций.

Инструкция по сборке gRPC из исходного кода была взята отсюда: "https://github.com/grpc/grpc/blob/master/BUILDING.md". Я искал, где эти функции были реализованы обратно в исходном коде gRPC, и обнаружил, что он находится в проекте grpc ++., который был скомпилирован как 'grpc ++. lib'. Я проверил, что этот файл включен в мой пакет nuget, в правильной конфигурации (Release) и архитектуре (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 ++ (StandНапример, я ничего не добавил):

#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

Любая помощь будет оценена!

...