如何静态链接Indy SSL文件?

7
我如何静态链接Indy OpenSLL文件?据我所知,只有ICS可以这样做,但奇怪的是Indy不行。它也没有提供.obj文件?这将允许我避免对dll的任何依赖。
4个回答

7

OpenSSL主要用于动态使用,这样可以在发布新的OpenSSL版本时轻松升级。但是,OpenSSL也可以静态编译,并且Indy 10.6.0+支持在iOS设备上静态链接到OpenSSL,但目前仅支持在iOS设备上(因为Apple不允许动态链接OpenSSL)。在所有其他平台(包括iOS模拟器)上,默认情况下Indy会动态链接到OpenSSL。如果您希望Indy在非iOS平台上静态链接到OpenSSL,则需要手动设置:

  1. 为您的目标平台编译/获取OpenSSL的静态链接对象文件(例如,iOS的静态.a文件可以在Indy的OpenSSL-Binaries GitHub repo中找到)。

  2. 更新Indy的IdCompilerDefines.inc文件,为您的目标平台定义USE_OPENSSLSTATICLOAD_OPENSSL

  3. IdSSLOpenSSLHeadersIdSSLOpenSSLHeaders_static单元添加到您的uses子句中。

  4. 确保IdSSLOpenSSLHeaders_static.pas在您的目标平台上编译通过(它当前是为iOS设计的,因此您可能需要进行调整)。

另一种选择是完全不使用OpenSSL,而是使用另一个可以静态链接并由适当的TIdSSLIOHandlerSocketBase实现包装的SSL/TLS库供Indy使用。例如EldoS SecureBlackbox提供了其SSL/TLS库的这样一个实现。未来,Indy计划在Windows上添加一个新的IOHandler实现来支持SChannel,因为它们已经安装在操作系统中,所以不需要分发DLL。


终于得到了我一直在等待的答案! :) 非常感谢! - Eric Santos
我需要编译 .obj 还是 .lib 文件吗? - Eric Santos
Delphi不使用.lib文件,所以您需要使用.obj文件。例如,Indy使用.obj文件进行静态ZLib导入。 - Remy Lebeau
我选择使用SecureBlackbox :) - Eric Santos
2
@MehmetFide 是的,这仍然在待办列表中。至于为什么最初没有实现它,我只能猜测,因为我没有参与Indy的早期版本。Indy是跨平台的,OpenSSL也是如此,因此使用适用于所有平台的单个代码是有道理的。直到最近几年,对于所有平台上的OpenSSL的支持才开始动摇。此外,即使在Windows是唯一支持的平台时,使用OpenSSL而不是SChannel进行SSL/TLS仍然更加普遍。 - Remy Lebeau
显示剩余7条评论

0

你不能静态链接任何 DLL。这个扩展名字面上代表“动态链接库”。

没有依赖项会使你正在开发的可执行文件/库变得更大,受到许可问题的限制,并且更新会变得更困难:为什么你不想要一个共享对象(DLL)呢?

只需将 DLL 包含在你的项目中即可。


如果您有源代码,可以在应用程序中编译库,而不需要该库;但是您的源目录可能会变得非常庞大,而且您必须遵守许可证,例如如果使用GPL,则必须将您的源代码公开领域化。 - RamblingMad
DLL是“动态链接”的,它不能被静态链接。如果您将dll与项目一起包含,则它并不是真正的外部依赖项,而只是主可执行文件的间接部分。 - RamblingMad
这个DLL来自代码。不要将该代码编译为DLL,而是编译为obj或静态库,并进行链接。你没有理解问题。 - David Heffernan
实际上,我理解得很好;他只是改变了它。看一下问题的编辑。 - RamblingMad
虽然讨论有点晚了,但静态链接到 SSL 与 DLL 文件无关,而是编译或获取 .lib 或 .obj C/C++ 文件并将其直接链接到 Delphi .exe 文件中。只要有一个公开类型和函数的单元,库就会直接可用。 - Jon Lennart Aasenden

0
这是关于编程的内容:

这个怎么样:http://enigmaprotector.com/en/aboutvb.html

它只适用于Windows(我想),但你可以将所有的DLL绑定到你的主程序或者甚至将依赖的DLL绑定到主DLL。


0

1
只有当你想让你的应用程序被病毒扫描器阻止,并且你喜欢冒着使用不受支持的系统级黑客的风险时,才这样做。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接