【问题标题】:How to statically link Indy SSL files?如何静态链接 Indy SSL 文件?
【发布时间】:2013-10-30 23:38:22
【问题描述】:

如何静态链接 Indy OpenSLL 文件? AFAIK 只有 ICS 允许这样做,但出于某种奇怪的原因,Indy 不允许这样做。它也不提供 .obj 文件吗?这将允许我避免对 dll 的任何依赖。

【问题讨论】:

    标签: delphi indy


    【解决方案1】:

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

    1. 为您的目标平台编译/获取用于 OpenSSL 的静态 .lib/.a 文件(Indy 的Fulgan mirror 提供了用于 iOS 的静态 .a 文件)。

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

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

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

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

    【讨论】:

    • 终于有一个我一直在等待的答案! :) 非常感谢!
    • 我必须编译 .obj 还是 .lib?
    • Delphi 不使用 .lib 文件,因此您需要 .obj 文件。例如,Indy 将 .obj 文件用于其静态 ZLib 导入。
    • 我选择使用 SecureBlackbox :)
    • @MehmetFide 是的,它仍在待办事项列表中。至于为什么从一开始就没有实现,我只能推测,因为我没有参与 Indy 的早期版本。 Indy 是跨平台的,OpenSSL 也是如此,因此使用适用于所有平台的单一代码是有意义的。只是在最近几年,所有平台上对 OpenSSL 的支持才开始动摇。此外,即使在 Windows 是唯一受支持的平台时,使用 OpenSSL 而不是 SChannel 来实现 SSL/TLS 仍然更为普遍。
    【解决方案2】:

    您不能静态链接任何 DLL。该扩展名的字面意思是“动态链接库”。

    没有依赖项会使您正在开发的可执行文件/库变得更大并受到许可问题的影响,同时也使更新变得更加困难:您为什么不想要共享对象 (DLL)?

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

    【讨论】:

    • 如果你有源代码,你可以在你的应用程序中编译库,不需要库;但是之后您的源目录可能会很大,并且您必须尊重许可证,例如如果是 gpl,那么您必须将您的源代码设为公共域。
    • 一个 DLL 是“动态链接的”,它不能被静态链接。此外,如果您将 dll 包含在您的项目中,它并不是真正的外部依赖项,只是不是主要可执行文件的直接一部分。
    • DLL 来自代码。不是将该代码编译为 DLL,而是编译为 obj 或静态库,然后将其链接。你没看懂问题。
    • 其实我理解的很好;他只是改变了它。查看对问题的修改。
    • 讨论有点晚了,但静态链接到 SSL 与 DLL 文件无关,而是编译或获取 .lib 或 .obj C/C++ 文件并将它们直接链接到 Delphi 。 exe文件。只要有一个公开类型和函数的单元,该库就可以直接使用。
    【解决方案3】:

    这个呢:http://enigmaprotector.com/en/aboutvb.html

    它只是 Windows(我认为),但您可以将所有 DLL 绑定到主 EXE,甚至可以将依赖 DLL 绑定到主 DLL。

    【讨论】:

      【解决方案4】:

      将 OpenSSL DLL 从资源加载到内存中是否可行?

      http://delphi.about.com/od/windowsshellapi/a/delphi-load-resource-dll-into-memory.htm

      【讨论】:

      • 只有当你想让你的应用程序被病毒扫描程序阻止并且你喜欢使用不受支持的系统级黑客攻击时
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 2013-04-06
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 2017-06-23
      相关资源
      最近更新 更多