将谷歌protobuf lib静态链接到dll库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将谷歌protobuf lib静态链接到dll库相关的知识,希望对你有一定的参考价值。

在安装和使用谷歌protobuf库(Install Protobuf On Windows)的教学页面上,它指出:

如果您的项目本身是一个供第三方软件使用的DLL,我们建议您不要在库的公共接口中公开协议缓冲区对象,并将协议缓冲区静态链接到库中。

我想知道如何实现这一目标。据我所知,你可以通过两种方式构建谷歌protobuf:静态和动态。

如果你动态地构建它,你将面临前面提到的问题。如果您静态构建它,那么您在Visual Studio的多线程(/ MT)中使用代码生成类型。这意味着在我的DLL lib(使用多线程DLL(/ MD)构建它)中,您将收到以下链接器错误:

错误LNK2038:检测到'RuntimeLibrary'不匹配:值'MTd_StaticDebug'与Emulator.obj中的值'MDd_DynamicDebug'不匹配

现在有一些问题涉及如何解决这个问题:

但答案通常是,更改您的lib以匹配其他库的构建类型。问题是,我不想这样做,我想要一个DLL。我想静态链接谷歌protobuf,如他们的文档中所述。我怎样才能实现这一目标?

答案

正如@MSalters所指出的,在答案here中,代码生成的配置并不表示构建的lib的类型,而是指示使用的c++ std lib的类型。为了在命令行构建中修改它,需要使用-Dprotobuf_MSVC_STATIC_RUNTIME开关(有关此参数的建议来自@Ation answer here)。为了设置构建以使用专用于google protobuf的多线程DLL(/ MD),在从CMAKE生成makefile时,必须执行以下操作,以进行调试:

cmake -G "NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Debug  -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ^
-DCMAKE_INSTALL_PREFIX=../../../install/debug ^
../..

或者发布:

cmake -G "NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Release -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ^
-DCMAKE_INSTALL_PREFIX=../../../install/release ^
../..

由以下nmake命令生成的代码将具有多线程DLL(/ MD)类型的代码生成。

另一答案

你需要建立自己的protobuf:

  • 确保你有CMake
  • protobuf github下载您的protobuf版本源代码
  • 在VS developer命令行中打开此文件夹
  • 运行cmake cmake -G“Visual Studio 14”-Dprotobuf_MSVC_STATIC_RUNTIME = ON

您可能想要更改VS版本,请检查cmake帮助消息以获取正确的生成器名称。

在那之后 - 一切都应该很容易。打开生成的解决方案,检查运行时lib设置,构建发布和调试版本。

并将这些文件(或dirs)包含到项目链接设置中(对于发布和调试,应该有不同的lib文件)。

另一答案

“。如果你静态构建它,那么你在Visual Studio的多线程(/ MT)中使用代码生成类型”

不,那是你的错误。

/MT定义了您使用的CRT库。它不是您生成的库类型的开关。

另一答案

创建一个使用正确库的自定义静态构建的protobuf库(您可能希望单独保留默认配置以与DLL的发布版本一起使用)。这样你的DLL将在调试版本中使用调试protobuf库,在发布版本中使用发布protobuf库。

以上是关于将谷歌protobuf lib静态链接到dll库的主要内容,如果未能解决你的问题,请参考以下文章

dll和lib(包括静态链接库和与dll同时生成的lib)

将dll转换为lib以进行静态链接?

在执行任何程序代码之前,通过静态 .lib 链接到 dll 的程序会发生啥?

C++中lib 和 dll 的区别,生成以及使用详解

将谷歌广告添加到 windows phone 8.1 应用程序

C++ - 谷歌 protobuf