我有一个BPL项目(包含一些基础内容)和一个EXE项目,其中包含其他项目输出(BPL和DCP)的位置。当使用" Build With Runtime Packages"构建EXE项目时,它构建正常。但是,它需要我部署EXE和BPL。到目前为止一切都很好。
由于我只是部署EXE(无论它变大),我猜我只是取消选中" Build with Runtime Packages"这就是它,但事实并非如此。它不会构建,并开始抱怨缺少的类。我可以编译EXE项目的唯一方法是将实际BPL项目的DCU路径添加到EXE项目的搜索路径中。我可以这样做,但为什么我被迫指向DCU? Delphi不能从BPL中取出它们吗?这不只是一个品味的问题,如果我走这条路,并链接到DCU,当谈到属于表格的DCU时,它会问我表格DFM,迫使我还包括我的源文件夹到EXE项目的搜索路径,现在它似乎正在编译,这是令人望而却步的。每次我想编译我的EXE项目时,我都无法重新编译我的BPL项目代码库。
我希望我已经说清楚了。
对于如何实现标题中提出的内容的任何帮助表示赞赏。
谢谢。
答案 0 :(得分:5)
有两种方法可以链接外部库:静态和动态。
使用运行时包时,这是动态链接。实际实现在BPL
文件中(实际上是一个简单的dll),在进程启动时从中导入方法和类。这会减少exe
大小,但需要发送BPL
个文件(与通常的dll相同)。不需要DCU
个文件,因为所有内容都已编译和链接,链接器只需要创建导入部分。
当禁用运行时包时,链接器必须为所有类和方法获取目标文件,并将其合并到一个可执行文件中。它无法从BPL
中提取此数据,因为它已经链接了可执行文件。它必须首先取消链接,分离不同的模块实现,这基本上是不可能的。因此,您必须提供DCU
个文件,其中包含用于链接程序的编译目标代码。
所以回答你的问题标题很简单 - 不可能。
答案 1 :(得分:2)
不,你不能。如果要使用运行时包,则必须打开编译器选项以使用运行时包进行构建。
关于你问题的第二部分: 使用运行时包构建使用* .dcp文件进行编译(.dfm流链接到包'资源,因此不需要直接使用* .dfm文件)。 没有运行时包的构建需要* .dcu和* .dfm文件(以及任何其他所需文件)。
在任何一种情况下,您都需要在库/搜索路径中拥有所需的文件才能进行编译/构建。
答案 2 :(得分:0)
有可能,但是很难实现。
为此,您将需要创建第三个项目-加载程序。
您需要将原始EXE项目转换为使用运行时程序包构建的DLL。
加载程序可以将DLL项目,rtl.bpl,vlc.bpl和BPL项目包含为加载程序可执行文件中的资源。
加载程序将需要手动执行LoadLibrary
Windows API完成的所有操作。
您可以阅读有关如何从内存中加载DLL以及查找一些以here开头的代码示例的更多信息。