c++ - 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 项目中链接库的正确方法,您可以分享您的信息吗?
解决方案
终于有机会回到这个话题了。问题归结为两件事:1.意识到您可以指定一个三元组(如原始问题中所述)。2. 最后实现使用静态库也意味着我必须将我的应用程序切换到静态 c 运行时库而不是共享 dll。
我无法切换我的应用程序。不过,我已经用这种非静态模式操作完成了测试。我没有看到任何问题,但其他人是否使用 protobufs(和 gRPC 这种方式) - 似乎不推荐。
推荐阅读
- java - ModelAndView 不向 JSP 返回数据
- python - Python 中的 Null 或 None 函数
- javascript - 了解传递给解析的多个参数的顺序,以及赋予 .then() 的值
- javascript - 为什么 Typescript 不要求我的函数返回某种类型?
- python - sqlalchemy.orm.exc.UnmappedInstanceError:类'builtins.dict'未映射
- r - 没有数据时如何避免geom_line或geom_path中的连接线?
- wpf - 在多个网格之间共享列宽
- reactjs - 如何在反应确认警报中重定向到另一个页面?
- arrays - 二维数组中的递归蛮力实现
- python - 如何使用请求下载具有原始名称的文件?