簡體   English   中英

是否可以單獨根據BPL / DCP構建針對BPL / DCP的EXE項目,其中“Build With Runtime Packages”未經檢查?

[英]Can one build an EXE project against a BPL/DCP with “Build With Runtime Packages” unchecked, based solely on the BPLs/DCPs?

我有一個BPL項目(有一些基礎東西)和一個EXE項目,它在其搜索路徑中有另一個項目輸出的位置(BPL和DCP)。 當使用“Build With Runtime Packages”構建EXE項目時,它構建正常。 但是,它需要我部署EXE和BPL。 到現在為止還挺好。

因為我寧願只部署EXE(無論它變大),我猜我只是取消選中“Build With Runtime Packages”並且就是這樣,但事實並非如此。 它不會構建,並開始抱怨缺少的類。 我可以編譯EXE項目的唯一方法是將實際BPL項目的DCU路徑添加到EXE項目的搜索路徑中。 我可以這樣做,但為什么我被迫指向DCU? 德爾福不能把它們從BPL中拿走嗎? 這不只是一個品味的問題,如果我走這條路,並鏈接到DCU,當涉及到屬於表格的DCU時,它會詢問我的表格DFM,迫使我也包括我的源文件夾到EXE項目的搜索路徑,現在它們似乎正在編譯,這是令人望而卻步的。 每次我想編譯我的EXE項目時,我都無法重新編譯我的BPL項目代碼庫。

我希望我已經說清楚了。

如何實現標題中提出的任何幫助表示贊賞。

謝謝。

鏈接外部庫有兩種方法: 靜態動態

使用運行時包時,這是一個動態鏈接。 實際的實現是在BPL文件中(實際上是一個簡單的dll),在進程啟動時從它導入方法和類。 這減少了exe大小,但需要發送BPL文件(與通常的dll相同)。 不需要DCU文件,因為一切都已經編譯和鏈接,鏈接器只需要創建導入部分。

禁用運行時包時,鏈接器必須為所有類和方法獲取目標文件,並將其合並到一個可執行文件中。 它無法從BPL提取此數據,因為它已經鏈接了可執行文件。 它必須首先取消鏈接 ,分離不同的模塊實現,這基本上是不可能的。 因此,您必須提供DCU文件,其中包含用於鏈接程序的編譯目標代碼。

所以回答你的問題標題很簡單 - 不可能。

不,你不能。 如果要使用運行時包,則必須打開編譯器選項以使用運行時包進行構建。

至於問題的第二部分:使用運行時包構建使用* .dcp文件進行編譯(.dfm流鏈接到包的資源中,因此不需要直接使用* .dfm文件)。 沒有運行時包的構建需要* .dcu和* .dfm文件(以及任何其他所需的文件)。

在任何一種情況下,您都需要在庫/搜索路徑中擁有所需的文件才能進行編譯/構建。

這是可能的,但很難實現。 您需要為此目的創建第三個項目 - 裝載程序。 您需要將原始EXE項目轉換為使用運行時pckage構建的DLL。 加載器可以包含您的DLL項目,rtl.bpl,vlc.bpl和您的BPL項目作為加載程序可執行文件中的資源。 Loader需要手動完成LoadLibrary Windows API所做的所有事情。

您可以閱讀有關如何從內存加載DLL的更多信息,並在此處查找一些代碼示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM