代码之家  ›  专栏  ›  技术社区  ›  Fantastic Mr Fox

将google protobuf库静态链接到dll库中

  •  7
  • Fantastic Mr Fox  · 技术社区  · 7 年前

    在安装和使用google protobuf库的说明页面上( Install Protobuf On Windows )它指出:

    如果项目本身是供第三方软件使用的DLL,建议不要在库的公共界面中公开协议缓冲区对象,并且 将协议缓冲区静态链接到库中 .

    我想知道如何才能做到这一点。据我所知,您可以通过两种方式构建google protobuf:静态和动态。

    如果你动态地构建它,你将面临上述问题。如果以静态方式构建,则使用Visual studio中的代码生成类型 多线程(/MT) . 这意味着在我的dll库中 多线程DLL(/MD) )您将收到以下链接器错误:

    错误LNK2038:“RuntimeLibrary”检测到不匹配:值“MTd\U StaticDebug”与Emulator中的值“MDd\U DynamicDebug”不匹配。obj公司

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

    但答案通常是,更改lib以匹配其他库的构建类型。问题是,我不想这样做,我想要一个DLL。我想静态链接google protobuf,正如他们文档中所描述的那样。 我怎样才能做到这一点?

    4 回复  |  直到 7 年前
        1
  •  7
  •   Fantastic Mr Fox    7 年前

    正如@mAlters在回答中指出的 here 代码生成的配置并不指示生成的lib的类型,而是指示 c++ std lib 已使用。为了在命令行生成中修改此内容,需要使用 -Dprotobuf_MSVC_STATIC_RUNTIME 开关(关于此参数的建议来源于@iation answer here ). 为了设置要使用的生成 多线程DLL(/MD)) 专门针对google protobuf ,从CMAKE生成makefiles时,必须执行以下操作以进行调试:

    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)) .

        2
  •  3
  •   Ation    7 年前

    您需要构建自己的protobuf:

    • 确保你有 CMake
    • 从下载protobuf版本源代码 protobuf github
    • 在VS developer命令行中打开此文件夹
    • 运行cmake

      cmake-G“Visual Studio 14”-Dprotobuf\u MSVC\u STATIC\u RUNTIME=打开

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

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

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

        3
  •  2
  •   MSalters    7 年前

    “。如果静态构建,则使用Visual studio中的多线程(/MT)代码生成类型”

    不,那是你的错误。

    /MT 定义您要使用的CRT库 消费 . 这不是您所选择的库类型的开关 生产 .

        4
  •  -1
  •   SoronelHaetir    7 年前

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