I assume you included your Debug folder as an additional library folder and added all the libs as dependencies in your Linker options.
Am Dienstag, 26. November 2019 00:38:27 UTC+1 schrieb Stéphane Charette: > > (Windows10, Visual Studio Community 2019, protobufs v3.10.1, gRPC v1.20.0.) > > I need to use protocol buffers and gRPC to get some data, and then combine > that with other things to write a plugin for an existing Windows > application. So my plugin will be a .dll that is dynamically loaded by the > application which I didn't write and cannot control. > > For that reason, I wanted gRPC and protocol buffers to be statically > linked into my .dll. This way users will only have a single .dll file they > need to manage. But I'm having a very difficult time figuring out how to > properly build protobufs and grpc for Windows so I can link a .lib file > into the rest of my code. > > I first tried to use vcpkg, like this: > > vcpkg.exe install zlib:x64-windows-static > vcpkg.exe install c-ares:x64-windows-static > vcpkg.exe install openssl:x64-windows-static > vcpkg.exe install protobuf[zlib]:x64-windows-static > vcpkg.exe install grpc:x64-windows-static > > If I remember correctly, this led to some link-time problems because the > libs use /MT, while the application uses/expects /MD. So then I switched > to this: > > vcpkg.exe install zlib:x64-windows > vcpkg.exe install c-ares:x64-windows > vcpkg.exe install openssl:x64-windows > vcpkg.exe install protobuf[zlib]:x64-windows > vcpkg.exe install grpc:x64-windows > > But I believe this gave me .dll files instead of .lib files. I even tried > this from a post I saw somewhere: > > SET ( VCPKG_CRT_LINKAGE dynamic ) > SET ( VCPKG_LIBRARY_LINKAGE static ) > > So now I'm trying to build protobufs and grpc from scratch. E.g., > > git clone -b v3.10.1 https://github.com/protocolbuffers/protobuf.git > cd protobuf > git submodule update --init --recursive > cd cmake > mkdir build64 > cd build64 > cmake -DCMAKE_BUILD_TYPE=Debug -Dprotobuf_BUILD_TESTS=OFF > -Dprotobuf_WITH_ZLIB=OFF .. > > I then copied the resulting .lib files into my plugin project, but I'm > still seeing several unresolved external symbols, such as this: > > 1>app.pb.obj : error LNK2019: unresolved external symbol > "__declspec(dllimport) public: void __cdecl > google::protobuf::internal::ArenaStringPtr::ClearToEmpty(class > std::basic_string<char,struct std::char_traits<char>,class > std::allocator<char> > const *,class google::protobuf::Arena *)" > (__imp_?ClearToEmpty@ArenaStringPtr@internal@protobuf@google@@QEAAXPEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEAVArena@34@@Z) > > referenced in function "public: static void __cdecl > google::protobuf::internal::MapTypeHandler<9,class > std::basic_string<char,struct std::char_traits<char>,class > std::allocator<char> > >::Clear(struct > google::protobuf::internal::ArenaStringPtr *,class google::protobuf::Arena > *)" > (?Clear@?$MapTypeHandler@$08V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@internal@protobuf@google@@SAXPEAUArenaStringPtr@234@PEAVArena@34@@Z) > > So I'm still barking up the wrong tree. > > The files I'm attempting to linking against are: > > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/gpr.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/grpc.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/grpc_cronet.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/grpc_unsecure.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/grpc++_cronet.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/grpc++_unsecure.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/grpc++.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/address_sorting.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/cares.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/zlibd.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/libprotobuf-lited.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/libprotobufd.lib > ${CMAKE_HOME_DIRECTORY}/3rd-party/Debug/libprotocd.lib > > This was my attempt to manually fixing up the .lib against which to link. > Originally, I had tried it like this: > > FIND_PACKAGE ( Threads REQUIRED) > FIND_PACKAGE ( ZLIB REQUIRED) > FIND_PACKAGE ( c-ares CONFIG REQUIRED) > FIND_PACKAGE ( OpenSSL REQUIRED) > FIND_PACKAGE ( protobuf CONFIG REQUIRED) > FIND_PACKAGE ( gRPC CONFIG REQUIRED) > > SET ( SPLICE_EXTERNAL_DEPS > Threads::Threads > protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite > gRPC::gpr gRPC::grpc gRPC::grpc++ gRPC::grpc_cronet > # c-ares::cares_static > c-ares::cares # c-ares::cares_static ? should I be using static? > OpenSSL::SSL OpenSSL::Crypto > ZLIB::ZLIB > ) > > Another possibly-related question: gRPC seems to include protocol > buffers. Am I reading that correct? By building gRPC, am I already > building protobufs, and thus shouldn't bother with protobufs directly? > > Thanks for any pointers, > > Stéphane > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/protobuf/36b2f016-a31c-4f05-8e77-60337b7ff7b6%40googlegroups.com.
