首页 > 解决方案 > vcpkg-built google protobuf 和 grpc 不会静态链接到应用程序

问题描述

工具和版本: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): warning C4251: 'google::protobuf::Duration::_internal_metadata_': class 'google ::protobuf::internal::InternalMetadataWithArena' 需要有 dll 接口供类 'google::protobuf::Duration' 的客户端使用

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

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

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

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

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

标签: c++visual-studio-2017protocol-buffersgrpcvcpkg

解决方案


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

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


推荐阅读