当前位置: 首页 > 知识库问答 >
问题:

vcpkg构建的谷歌协议和grpc不会静态链接到应用程序

龙骏
2023-03-14

工具和版本:Microsoft Windows上的Visual Sudio 2017、Google Protobufs 3.11.3、gRPC 1.27.1、vcpkg 2020.02.04

我使用vcpkg为Windows(x86)构建了gRPC和protobuf(以及其他依赖项)的Windows本机C版本。一切都成功构建。

在构建应用程序时,我将“libprotobuf.lib”作为链接器输入。但是,它没有链接。相反,我的程序只有在“libprotobuf.dll”存在以供程序加载时才会运行。我不知道还有什么方法可以指定库应该是静态链接的。

在构建应用程序的过程中,我看到了很多类似这样的警告:include\google\protobuf\duration。pb。h(220):警告C4251:“google::protobuf::Duration::\u internal\u metadata\”:类“google::protobuf::internal::InternalMetadataWithArena”需要具有dll接口才能由类“google::protobuf::Duration”的客户端使用

这个页面提到了警告,并说静态链接是默认的,但似乎vcpkg不是这样构建的,或者我需要以不同的方式引用库。

我也看到了这个提供解决方案的页面。这有点帮助。它使Visual Studio能够识别未解析的外部,因此至少它尝试静态链接。lib文件。有了它,我尝试了各种组合。protobuf、grpc和依赖项的lib文件,但我仍然无法获得成功的构建,编译器警告仍然会生成。

我觉得在构建vcpkg的过程中,我缺少了一些可以以不同方式构建标头或库的东西(可能是预处理器定义的)。我试图更改一些构建设置,但当vcpkg为构建生成cmake文件时,它们总是被覆盖。

或者我缺少从我的项目中引用的正确库文件组合。

有人让它工作了吗?如果您有通过vcpkg构建静态链接库的示例,或者在VS2017项目中链接库的正确方法,您可以分享您的信息吗?

共有1个答案

袁鸿达
2023-03-14

终于有机会回到这一点。问题归结为两件事: 1.意识到你可以指定一个三元组(如原始问题中所述)。2.最终意识到使用静态库也意味着我必须将我的应用程序切换到静态c运行时库而不是共享dll。

我无法切换我的应用程序。不过,我已经用这种非静态模式操作进行了测试。我没有看到任何问题,但是否有其他人使用protobufs(和gRPC的这种方式)-这似乎不推荐。

 类似资料:
  • 在共享的情况下,我使用的是cmake文件 在静态情况下 我认为我只需要更改如何从 失败:cmd.exe/c“cd.&&clang++.exe-target=aarch64-none-linux-android-gcc-toolchain=c://android/android-sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/

  • 当编译一个C程序时,它按照预处理器、编译器、汇编程序、链接器的顺序进行。

  • 静态链接方法:静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来 静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库 动态链接方法:使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这

  • 在编译Linux程序时,我们经常会看到动态链接和静态链接这两个术语。这两个术语中是我Linux的共享函数库(shared libraries)相关的。共享函数库就象Windows系统里的.dll文件,它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余,程序当中就不用包含每个常用函数的拷贝,只是在需要时调用系统中共享函数库中常函数功能即可。这种方式我们称之为动态链接(Dynamical

  • 我正在构建一个软件来远程控制连接到另一台PC的无线电硬件。 我计划使用ZeroMQ进行传输,并使用类似于RPC的请求-回复,其上有表示操作的不同消息。 虽然我的大多数消息只是一些控制和状态信息,但应该可以选择设置要传输的数据blob或请求要接收的数据blob。这些数据blob通常在5-10MB的范围内,但也应该可以使用最大100MB的较大blob。 对于消息格式,我发现google协议缓冲区非常有

  • 接下来,我生成了自己的OAuth2客户机ID并使用它。这种方法很简单,直到我开始收到来自Google的“匿名使用过期”错误,一段时间后我意识到这是因为密钥没有启用只读日历范围。 我的下一个想法是公开日历,并使用静态API密钥,但日历是从一个名为Peak Pro的预订服务中同步的,该服务用参加活动的客户的姓名、电子邮件和电话号码填充日历描述。我不能公开揭露那些。 接下来,我被吸引到了CalDAV A