delphi - 是否可以仅基于 BPL/DCP,针对未检查 "Build With Runtime Packages"的 BPL/DCP 构建 EXE 项目?

标签 delphi build bpl delphi-10.1-berlin dcu

我有一个 BPL 项目(带有一些基本内容)和一个 EXE 项目,该项目的搜索路径中包含其他项目输出(BPL 和 DCP)的位置。当使用“Build With Runtime Packages”构建 EXE 项目时,它构建得很好。但是,它需要我部署 EXE 和 BPL。到目前为止一切顺利。

因为我宁愿只部署 EXE(无论它变得更大),所以我想我只需取消选中“使用运行时包构建”就可以了,但事实并非如此。它不会构建,并开始提示缺少的类。编译 EXE 项目的唯一方法是将实际 BPL 项目的 DCU 的路径添加到 EXE 项目的搜索路径中。我可以做到这一点,但为什么我必须指向 DCU? Delphi 不能直接从 BPL 中拿走它们吗?这不仅仅是一个品味问题,如果我这样做,并链接到DCU,当涉及到属于表单的DCU时,它会要求我提供表单DFM,迫使我也将我的源文件夹包含到EXE中项目的搜索路径,现在看起来它们正在编译,这是令人望而却步的。每次我想编译 EXE 项目时,我无法重新编译 BPL 项目代码库。

我希望我已经说清楚了。

对于如何实现标题中所要求的任何帮助,我们表示赞赏。

谢谢。

最佳答案

链接外部库有两种方法:静态动态

当您使用运行时包时,这是一个动态链接。实际的实现是在 BPL 文件中(实际上是一个简单的 dll),方法和类是在进程启动时从中导入的。这会减少 exe 大小,但需要传送 BPL 文件(与通常的 dll 相同)。不需要 DCU 文件,因为所有内容都已经编译和链接,链接器只需要创建导入部分。

当运行时包被禁用时,链接器必须获取所有类和方法的目标文件,并将其组合成一个可执行文件。它无法从 BPL 中提取此数据,因为它已经是链接的可执行文件。它必须首先取消链接,分离不同的模块实现,这基本上是不可能的。因此,您必须提供 DCU 文件,其中包含编译后的目标代码来链接您的程序。

所以你的问题标题的答案很简单 - 不,这是不可能的。

关于delphi - 是否可以仅基于 BPL/DCP,针对未检查 "Build With Runtime Packages"的 BPL/DCP 构建 EXE 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39219632/

相关文章:

delphi - Exit(1) 或 Result := 1; Exit in Delphi? 之间有什么区别

delphi - 如何在 Delphi 6 - 2007 中保持表单和框架的可编译性?

build - MKS : Not able to drop member from sandbox

Delphi - 应用程序的 .bpl 插件 - 加载 > 1 个插件时出现问题

delphi - 在 LoadLibrary 中动态加载 BPL 失败

Delphi 项目需要运行时包,即使运行时包已关闭

delphi - 使用 INDY SMTP 服务器

德尔福通用框架

ios - Xcode 6.1.1 (null) 无法运行 arm64

c++ - GNU Make 会自动添加额外的先决条件吗?