OpenSSL主要用于动态使用,这样可以在发布新的OpenSSL版本时轻松升级。但是,OpenSSL也可以静态编译,并且Indy 10.6.0+支持在iOS设备上静态链接到OpenSSL,但目前仅支持在iOS设备上(因为Apple不允许动态链接OpenSSL)。在所有其他平台(包括iOS模拟器)上,默认情况下Indy会动态链接到OpenSSL。如果您希望Indy在非iOS平台上静态链接到OpenSSL,则需要手动设置:
为您的目标平台编译/获取OpenSSL的静态链接对象文件(例如,iOS的静态.a
文件可以在Indy的OpenSSL-Binaries GitHub repo中找到)。
更新Indy的IdCompilerDefines.inc
文件,为您的目标平台定义USE_OPENSSL
和STATICLOAD_OPENSSL
。
将IdSSLOpenSSLHeaders
和IdSSLOpenSSLHeaders_static
单元添加到您的uses
子句中。
确保IdSSLOpenSSLHeaders_static.pas
在您的目标平台上编译通过(它当前是为iOS设计的,因此您可能需要进行调整)。
另一种选择是完全不使用OpenSSL,而是使用另一个可以静态链接并由适当的TIdSSLIOHandlerSocketBase
实现包装的SSL/TLS库供Indy使用。例如EldoS SecureBlackbox提供了其SSL/TLS库的这样一个实现。未来,Indy计划在Windows上添加一个新的IOHandler实现来支持SChannel,因为它们已经安装在操作系统中,所以不需要分发DLL。
你不能静态链接任何 DLL。这个扩展名字面上代表“动态链接库”。
没有依赖项会使你正在开发的可执行文件/库变得更大,受到许可问题的限制,并且更新会变得更困难:为什么你不想要一个共享对象(DLL)呢?
只需将 DLL 包含在你的项目中即可。
这个怎么样:http://enigmaprotector.com/en/aboutvb.html
它只适用于Windows(我想),但你可以将所有的DLL绑定到你的主程序或者甚至将依赖的DLL绑定到主DLL。
从资源中将OpenSSL DLL加载到内存中是否是可行的替代方案?
http://delphi.about.com/od/windowsshellapi/a/delphi-load-resource-dll-into-memory.htm