Fan*_*Fox 6 c++ dll linker linker-errors protocol-buffers
在安装和使用 google protobuf 库(在 Windows 上安装 Protobuf)的说明页面上,它指出:
如果您的项目本身是供第三方软件使用的 DLL,我们建议您不要在库的公共接口中公开协议缓冲区对象,并且将协议缓冲区静态链接到您的库中。
我想知道如何做到这一点。据我所知,您可以通过两种方式构建 google protobuf:静态和动态。
如果您动态构建它,您将面临上述问题。如果您静态构建它,那么您将使用多线程 (/MT) 的Visual Studio 中的代码生成类型。这意味着在我的 dll 库(它是用多线程 DLL (/MD)构建的)中,您将收到以下链接器错误:
错误 LNK2038:检测到“RuntimeLibrary”不匹配:值“MTd_StaticDebug”与 Emulator.obj 中的值“MDd_DynamicDebug”不匹配
现在有几个问题涉及如何解决这个问题:
但答案通常是,更改您的库以匹配其他库的构建类型。问题是,我不想那样做,我想要一个 DLL。我想静态链接 google protobuf,如他们的文档中所述。我怎样才能做到这一点?
正如@MSalters 所指出的,在此处的答案中,代码生成的配置不指示构建的库的类型,而是使用的类型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 ^
../..
Run Code Online (Sandbox Code Playgroud)
或释放:
cmake -G "NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Release -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ^
-DCMAKE_INSTALL_PREFIX=../../../install/release ^
../..
Run Code Online (Sandbox Code Playgroud)
以下nmake命令生成的代码将生成类型为多线程 DLL (/MD)) 的代码。
| 归档时间: |
|
| 查看次数: |
8890 次 |
| 最近记录: |