在安装和使用Google Protobuf库的指导页面上(在Windows上安装Protobuf),它指出:
如果您的项目本身是供第三方软件使用的DLL,则建议不要在库的公共接口中公开协议缓冲区对象,并且将协议缓冲区静态链接到库中。
我想知道如何实现这一点。据我所知,您可以通过两种方式构建Google Protobuf:静态和动态。
如果您以动态方式构建它,则会遇到上述问题。如果您以静态方式构建它,则使用Visual Studio的代码生成类型多线程(/MT)。这意味着在我的dll lib中(其中使用多线程DLL(/MD)构建),您将获得以下链接器错误:
错误LNK2038:在Emulator.obj中检测到“RuntimeLibrary”的不匹配:值“MTd_StaticDebug”与“MDd_DynamicDebug”不匹配。
现在有几个问题涉及如何解决这个问题:
如果您的项目本身是供第三方软件使用的DLL,则建议不要在库的公共接口中公开协议缓冲区对象,并且将协议缓冲区静态链接到库中。
我想知道如何实现这一点。据我所知,您可以通过两种方式构建Google Protobuf:静态和动态。
如果您以动态方式构建它,则会遇到上述问题。如果您以静态方式构建它,则使用Visual Studio的代码生成类型多线程(/MT)。这意味着在我的dll lib中(其中使用多线程DLL(/MD)构建),您将获得以下链接器错误:
错误LNK2038:在Emulator.obj中检测到“RuntimeLibrary”的不匹配:值“MTd_StaticDebug”与“MDd_DynamicDebug”不匹配。
现在有几个问题涉及如何解决这个问题:
- 错误 LNK2038:在CppFile1.obj中检测到'_MSC_VER'的不匹配:值'1600'与'value'1700'不匹配
- 'RuntimeLibrary'不匹配检测到不匹配
- (非常相似) 在MSVC 2013上链接到protobuf 3时出现错误
但通常的答案是,将您的库更改为与其他库的构建类型匹配。问题是,我不想这样做,我想要一个DLL。并且我想像他们的文档中描述的那样静态链接google protobuf。我该如何实现这一点?