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

Vla*_*sny 8 openssl

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

库有以下变体:

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

和"静态"的同名.你能解释一下这些之间的区别吗?

met*_*sim 10

  • MD 用于动态释放
  • MDd 用于动态调试
  • MT 用于静电释放
  • MTd 用于静态调试

源文章来自 archive.org [^ 1].

[^ 1]:原始链接


Rob*_*Rob 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版本,但是一旦编译,可以使用依赖性查看器从构建的目标中注明(例如,取决于.可执行程序).例如,如果您的应用程序依赖于MSVCR90.DLL,那么这意味着VC++ 9(令人困惑的是,这是2008年的可再发行组件).

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

静态联动:

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

动态联动:

  • 更小的占用空间,来自MSFT更新的错误修复,共享代码,有点难以安装

当您在库中返回C/C++对象(例如,已分配的内存,std :: string等)时,必须将您的代码与用于编译库的相同标志链接,没有例外.