2011-03-16 95 views
-1

我正在使用Delphi 5命令行編譯器進行編譯。構建不會報告任何錯誤,但它也不會生成EXE文件。DCC32命令行編譯器成功完成,但不生成EXE文件

我可以確認以下內容:

  • 做同樣的構建通過IDE正確的行爲。
  • IDE與DCC32構建之間的源代碼或選項沒有區別。
  • 僅在完整版本上發生此問題。即首先用-B選項進行編譯,然後在沒有選項的情況下執行編譯,然後「編譯」正確地生成EXE文件。
  • 在命令行中使用-E開關強制生成無效的生成輸出路徑不會報告錯誤 - 就好像甚至沒有嘗試生成EXE文件一樣。
  • 其他項目可以正確構建。
  • 我禁用了防病毒軟件,因此可以確認這不是問題。

編輯 雖然我經歷過這種用Delphi 5,它不是具體到該版本。 Delphi Bug List至少在D4-D6中證實了這個問題。

+0

什麼版本的Windows,什麼樣的sp級別,以及你有什麼A/V軟件?禁用A/V不是ev如果要用一些品牌的A/V軟件來修復它,那麼在我不相信它沒有破壞你的應用程序之前,它們將不得不被徹底刪除。 – 2011-03-16 12:19:46

回答

2

經過漫長的調查,我已經明確了這個問題。

  • 我寫了一個小批處理文件來構建並檢查EXE並報告成功或失敗。
  • 然後我經歷了一次一個地消除依賴關係並重新測試構建的艱辛過程。
  • 我最終將其追蹤到一個特定的編譯器指令{$ObjExportAll ON},該編譯器指令在我們的一些第三方軟件包中使用。
  • 在互聯網上搜索顯示,當爲了BCB支持而添加$ ObjExportAll時引入了此錯誤。 。雖然它似乎已經很少遇到 - 只是我的運氣:(
  • 我不能確定是否或哪個版本的錯誤是固定的

您可以測試與下面的簡單項目的bug:

program TestDCC32ObjExportAll; 

{$OBJEXPORTALL ON} 

begin 
end; 
  • 隨着指令,dcc32不創建EXE。
  • 沒有指令,dcc32 確實創建EXE。
  • IDE始終創建EXE。

幸運的是,我們根本不使用BCB,所以我只是簡單地禁用指令發生的任何地方。


編輯
美妙的資源The Delphi Bug List報告,這個問題被證實在德爾福4,5存在,和6遺憾的是,德爾福錯誤清單後停產。 :(

5

您可以使用SysInternale/Microsoft的ProcessMonitor來調查.exe的創建。運行procmon.exe並添加「路徑」「包含」(您的exe名稱),然後「包含」的過濾器。

在我的環境編譯t.pas了:

12:09:58,1927245 DCC32.EXE 3596 CreateFile C:\tmp\t.exe SUCCESS Desired Access: Generic Write, Read Attributes, Disposition: OverwriteIf, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: N, ShareMode: None, AllocationSize: 0, OpenResult: Overwritten 
    12:09:58,1928116 DCC32.EXE 3596 CreateFile C:\tmp\t.exe SUCCESS Desired Access: Read Attributes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Complete If Oplocked, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 
    12:09:58,1928281 DCC32.EXE 3596 QueryFileInternalInformationFile C:\tmp\t.exe SUCCESS IndexNumber: 0x46b00000000c296 
    12:09:58,1928376 DCC32.EXE 3596 CloseFile C:\tmp\t.exe SUCCESS 
    12:09:58,1961352 DCC32.EXE 3596 WriteFile C:\tmp\t.exe SUCCESS Offset: 0, Length: 19 968 
    .... 

也許是在dcc32錯誤?

+0

+1,但它不是dcc32中的錯誤。自從v1發佈以來,我在Delphi的每個版本中都使用過命令行編譯器,並且從來沒有遇到過這個問題。這個糟糕的錯誤會在很久以前被報道。這是某種配置問題(在.cfg文件或命令行選項中),ProcMon應該幫助弄清楚發生了什麼。 – 2011-03-16 11:26:59

+0

+1非常有用的信息,雖然它並沒有真正告訴我任何新東西。它只是證實了我在任何情況下所懷疑的--dcc32甚至沒有嘗試寫入EXE文件。 – 2011-03-19 13:57:16

+0

@Ken:現在小心,這種想法是導致很多人在錯誤的兔子洞裏浪費時間的原因,因爲錯誤的邏輯忽略了錯誤的洞。 ;)我確實表示其他項目的構建正確,因此dcc32中的錯誤確實需要滿足一些其他特殊條件。 (查看我的回答) – 2011-03-19 14:00:08

1

當我們有一些流氓的.dcu文件(我們確實有一個.pas文件)時,我記得在Delphi 5的某個地方有類似的東西(可能是Delphi 4或Delphi 6)。

在構建解決問題之前刪除.DCU文件。此外,反病毒軟件可以爲您的系統做出與時間有關的非常糟糕的事情;在那裏做到了這一點:由於這個原因,我的大多數開發系統都在沒有防病毒的虛擬機中。

嘗試在乾淨的機器上重現您的Delphi 5 dcc32問題(僅僅是Windows和您需要的Delphi組件)。

如果可行,請使用Process Monitor查看MichałNiklas建議的那些機器之間的差異。

1

我認爲這可能是一個非常已知的問題(對於那些,誰與D5的作品)。

例如,包含的FinalBuilder「德爾福5編譯器錯誤使用。解決方法」中的「構建Delphi工程」行動,它使用不同的選項創建項目兩次 - 專門用於創建exe,當dcc32沒有創建一個(根據幫助文件)。

Delphi 4或Delphi 6沒有類似的選項,所以我猜測它是在Delphi 5中引入並在Delphi 6中修復。

+0

感謝您的貢獻。是的,一種解決方法是構建(生成所有DCU)然後編譯。但是,德爾福錯誤列表確實報告該問題在D4-D6中得到確認。我更新了我的答案以表明這一點。 – 2011-04-25 12:52:11