链接libeay32MD.lib和libeay32MT.lib有什么区别?

时间:2011-01-03 19:18:03

标签: openssl

我有第三方应用程序源代码,目前设置为针对libeay32MD.lib构建。但这是应用程序,而不是库。它不应该是针对libeay32MT.lib构建的吗?两者有什么区别?

库有以下变体:

  • libeay32MD.lib
  • libeay32MDd.lib
  • libeay32MT.lib
  • libeay32MTd.lib

和具有相同名称的“静态”。你能解释一下这些之间的区别吗?

3 个答案:

答案 0 :(得分:10)

  • MD for dynamic-release
  • MDd for dynamic-debug
  • MT for static-release
  • MTd for static-debug

Source article通过archive.org [^ 1]。

[^ 1]:Original Link

答案 1 :(得分:10)

这些变体决定了使用哪个C ++库,以及生成了什么类型的代码,尽管只有'M'可用意味着多线程,但是不再有单线程选项。

  • MTd =多线程调试代码,并链接到C ++静态调试库
  • MDd =多线程调试代码,并链接到C ++动态(DLL)调试库
  • MT =多线程,链接到C ++静态库
  • MD =多线程,链接到C ++动态(DLL)库

刚编辑 - 抱歉,代码的顺序错误。

编辑2:更多信息......

这些标志是C ++选项,与要求ssleay32.dll和libeay32.dll无关。有一个版本的libeay32 - 4用于静态构建(不依赖于ssl / libeay32.dll),4个用于动态构建(需要ssl / libeay32.dll)。 4个中的每一个都分为 C ++库所需的类型......

C ++可以静态或动态地链接到您的应用程序,对于每种类型,您都可以使用调试库或发布库。

/ MT和/ MTd(静态)不需要C ++可再发行代码,因为所有C / C ++调用都包含在已编译的程序中。如果您链接的每个模块(不仅仅是ssleay& co。)都使用这些选项,那么您的应用程序将完全独立于C ++依赖项。

/ MD和/ MDd(动态)需要在目标计算机上安装C ++可再发行DLL。对于/ MD,可以从MSFT轻松下载版本,但是您还需要注意您使用的Visual C ++版本 - 例如VC ++ 2008,VC ++ 2010等有许多版本的可再发行组件,您可能需要它们。对于/ MDd,这些库将在您的开发计算机上,但MSFT没有针对此的一般发布 - 但是如果需要,您可以使用Visual Studio构建自己的安装程序;通常/ MDd仅供开发人员用于测试。

原始问题中的SSLEAY等版本并未指出使用Visual C ++的2005/2008/2010等版本来编译MD版本,但是一旦编译,可以使用依赖关系查看器从构建的目标中注明(例如depends.exe)。例如。如果您的应用程序依赖于MSVCR90.DLL,那么这意味着VC ++ 9(令人困惑的是,这是2008年的可再发行组件)。

所有开发人员都需要选择静态或DLL库链接,这里有一些注释:

静态链接:

  • 自包含,易于安装,更大的代码占用空间,在构建多个dll和exe时重复代码。

动态链接:

  • 占地面积更小,来自MSFT更新的错误修复,共享代码,更难安装

如果库中有代码返回C / C ++对象(例如已分配的内存,std :: string等),则强制将代码与用于编译的相同标志链接起来图书馆,没有例外。

答案 2 :(得分:0)

根据名称猜测,一个库用于多线程,另一个库用于带有调试符号的多线程。