2016-03-15 80 views
0

OpenSSL的1.0.2g包的INSTALL.W32文件有下列警告文字:静态链接的OpenSSL ++的malloc警告

一个有关编译链接到OpenSSL库的应用程序的最终意见。 如果您不使用多线程DLL运行时库(/ MD选项),您的 程序几乎肯定会崩溃,因为malloc会感到困惑 - OpenSSL DLL静态链接到一个版本,应用程序必须 不使用不同的。

我不完全理解这个或它的影响。他们是否说不支持静态链接libeay32mt.lib?

我们在我们的应用程序中遇到了随机崩溃,堆栈跟踪有时会指向openssl函数中的免费调用,这是否是此警告指向的预期症状?

回答

0

C和C++内存管理是在CRT(C运行时库)中实现的。映射到进程中的CRT的每个物理副本(静态编译到模块或引用的DLL中)都使用不同的堆。内存分配和释放必须在相同的堆上执行,即相同的物理CRT副本(有关更多详细信息,请参阅Potential Errors Passing CRT Objects Across DLL Boundaries)。

在特定情况下,您需要确保做到以下几点:

  • 对OpenSSL的DLL的动态链接应用程序。
  • 动态链接您的应用程序与CRT。
  • 验证您的应用程序和OpenSSL DLL链接是否与相同版本的CRT(版本和配置)相关联。

尽管可以静态链接到OpenSSL,但如果可以确保最终的二进制文件包含单个CRT实现并且不会(直接或间接)动态链接到CRT。这很难维护,并且一旦链接到一个库,就不会提供静态库。