2010-01-14 31 views
4

我正在將一箇舊項目從Delphi 2007遷移到Delphi 2010中。我發現的一件事是,結果可執行文件的大小增加了一倍多,而原始文件已經很大。 (超過50 MB)。我懷疑它與擴展RTTI有很大關係。

由於該項目早於Delphi 2010,因此它不會在任何地方使用擴展RTTI,因此我想保守一些。是否有任何方法可以使用「項目選項」對話框全局設置{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}作爲默認值?我曾預料在那裏有一個選項(和$WEAKLINKRTTI),但我沒有看到它們。

有誰知道這是否可以從「傳遞給編譯器的附加選項」字段或其他方式來完成?我真的不想爲項目中的每個單元添加一個包含文件,因爲其中有幾千個......

回答

4

您可以嘗試使用dcc32 –$weaklinkrtti命令行選項。 (如{$WEAKLINKRTTI ON})。
但是,這並沒有在每個單元{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}的影響。
最好的辦法是將它放在包含文件的每個單元的頂部。
但是,然後它不會爲VCL/RTL這樣做,它仍然會膨脹......

更新:還請確保您比較什麼是可比較的。例如,如果您沒有在新的D2010項目的鏈接器選項中包含調試信息,您可能沒有在D2007的項目中包含調試信息...

+0

我試着在項目選項中的「附加選項傳遞給編譯器」字段中放入'-weaklinkrtti',但它只是給了一個編譯器警告:[DCC Warning] W1030無效的編譯器指令:'-weaklinkrtti'。 – 2010-01-15 18:20:32

+0

對不起梅森,你必須在項目選項中包含$。我的錯。編輯答案。 – 2010-01-15 23:01:53

0

我不知道這樣的選項,但我仍然將使用包含文件。

對於任何有經驗的Delphi程序員來說,編寫一個小程序將{$i ProjectIncludeFile.inc}添加到您的文件夾中的任何單元(立即在單元行之後),我不會成爲問題。

這樣就可以將它用於任何你喜歡的目的。

我自己使用if f.i.設置一個WriteTempFiles編譯器指令(我使用f.i.在開發程序時在各個位置保存字符串列表內容),這樣我可以在程序準備部署時在一個地方禁用它。

由於我的大部分項目都涉及多個可執行文件和/或dll,因此這是完成整個項目的全局最簡單的方法。

1

你確定這是由新的RTTI信息引起的嗎?雖然這是很多數據,但它不應該使應用程序的規模增加一倍。

檢查它是否包含發佈版本可執行文件中的調試信息。 (項目選項 - > Delphi編譯器 - >調試信息應該是False)

至於這個問題,我使用{$ WEAKLINKRTTI ON}在dpr文件中的uses子句之前,它似乎工作正常。

1

comment on Mason's own blog,迴應我的評論,梅森回答了這個問題。

嘗試把這兩行你DPR頂部 ,uses子句前:

{$WEAKLINKRTTI ON} 
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} 

這將確保沒有RTTI得到了自己的代碼或任何 三階產生 您使用的第三方庫,除非 他們在顯式啓用RTTI 世代的單位。你 無法關閉RTL或VCL, ,但不應該爲你的尺寸添加太多 。

4

的$ RTTI指令的行爲,因爲XE6已經改變,因爲它實際上是一個bug因爲它被認爲是本地的當前單位(和它實際上documented as that since Delphi 2010)。

此外,即使在一個單元中,它也可能會對使用該指令產生致命的影響,因爲由於該錯誤,它基本上會切換影響以下單元的全局標誌(如編譯順序)。

相關問題