包含OpenSSL作为静态库,但它仍然在寻找DLL?

时间:2010-11-02 00:33:40

标签: visual-studio dll openssl static-libraries

我使用以下版本的安装程序在Windows上安装了OpenSSL 1.0.0: http://www.slproweb.com/products/Win32OpenSSL.html

我将.lib文件添加到我的项目中(这是Visual Studio,将其添加到Project Settings-> Linker-> Input),它编译并正常工作。但是,当我删除Windows \ system32中的OpenSSL DLL文件时,它会抱怨

"Debugger:: An unhandled non-continuable STATUS_DLL_NOT_FOUND exception was thrown during process load"

任何想法为什么它仍然在寻找DLL,即使它是用静态库编译的?我没有在项目的任何地方引用DLL。我包含的静态库是libeay32.lib和ssleay32.lib。

谢谢, -M

3 个答案:

答案 0 :(得分:4)

使用大小近19 MB的libeay32MT.lib文件作为您的库。因为它是一个静态库,但libeay32.lib是一个使用dll的库。

答案 1 :(得分:1)

它正在寻找DLL,因为代码是在运行时动态加载的。静态库中的代码只是一组调用DLL的存根函数 - 比较.lib和.dll文件的大小,我打赌你会看到DLL更大,因为那是大部分实际加密代码都在。

因此,正如您所发现的,您不应该删除DLL。为了正确分发程序,您还需要使用它分发这些DLL,以使其正常工作。但是,请记住,执行此操作存在法律问题,因为美国对某些加密代码存在出口限制。 因此,在重新分发这些DLL时要格外小心 - 更加确定您所做的事情是合法的

答案 2 :(得分:1)

您可以在此处获取静态库:

http://www.ie7pro.com/openssl/openssl-0.9.8g_static_win32.zip

(见http://www.ie7pro.com/openssl.html)。

这些是使用静态运行时库构建的,因此如果您使用的是VC ++,则可能需要转到:

配置属性 - > C / C ++ - >代码生成 - >运行时库

并选择/ MT而不是/ MD以避免链接冲突(或者在链接器中使用/ NODEFAULTLIB:LIBCMT等 - >命令行 - >其他选项)。