-1

Delphi5コマンドラインコンパイラを使用してビルドを行っています。ビルドはエラーを報告しませんが、EXEファイルも生成しません。

私は以下を確認することができます:

  • IDEを介して同じビルドを実行すると、正しく動作します。
  • IDEビルドとDCC32ビルドの間にソースコードやオプションに違いはありません。
  • この問題は、フルビルドでのみ発生します。つまり、最初に-Bオプションを指定してビルドを実行し、次に-Bオプションを指定せずにビルドを実行すると、「コンパイル」によってEXEファイルが正しく生成されます。
  • コマンドラインで-Eスイッチを使用して無効なビルド出力パスを強制しても、EXEファイルを生成する試みさえないかのようにエラーは報告されません。
  • 他のプロジェクトは正しくビルドされます。
  • ウイルス対策ソフトウェアを無効にしましたので、問題がないことを確認できます。

編集私はDelphi5でこれを経験しましたが、それはそのバージョンに固有のものではありません。Delphiバグリストは、少なくともD4-D6で問題を確認しました。

4

4 に答える 4

5

SysInternale/Microsoft の ProcessMonitor を使用して、.exe作成時に調査できます。procmon.exe「Path」「contains」(exe 名)、「include」でフィルターを実行して追加します。

私の環境でコンパイルすると、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ですか?

于 2011-03-16T11:15:25.727 に答える
2

長い調査の後、問題を特定することができました。

  • ビルドを実行して EXE をチェックし、いずれかの方法で成功または失敗を報告する小さなバッチ ファイルを作成しました。
  • 次に、依存関係を 1 つずつ削除し、ビルドを再テストするという骨の折れるプロセスを実行しました。
  • {$ObjExportAll ON}最終的に、いくつかのサードパーティ パッケージで使用されている特定のコンパイラ ディレクティブまで突き止めました。
  • インターネットを検索すると、BCB サポートのために $ObjExportAll が追加されたときにこのバグが導入されたことが明らかになりました。めったに遭遇しないようですが、私の運だけです:(
  • バグが修正されたかどうか、またはどのバージョンが修正されたかはわかりません。

次の単純なプロジェクトでバグをテストできます。

program TestDCC32ObjExportAll;

{$OBJEXPORTALL ON}

begin
end;
  • このディレクティブを使用すると、dcc32 は EXE を作成しません。
  • ディレクティブがない場合、dcc32EXE を作成します。
  • IDE は常に EXE を作成します。

幸いなことに、私たちは BCB をまったく使用していません。


編集
素晴らしいリソースThe Delphi Bug Listは、問題がDelphi 4、5、および6に存在することが確認されたと報告しています。残念ながら、Delphi Bug Listはその後中止されました。:(

于 2011-03-19T14:16:39.067 に答える
1

これは非常によく知られている問題だと思います (D5 を使用する人にとっては)。

たとえば、FinalBuilder には、「Delphi プロジェクトのビルド」アクションに「Delphi 5 コンパイラ バグの回避策を使用する」が含まれています。これは、プロジェクトを異なるオプションで 2 回ビルドします。具体的には、dcc32 が exe を作成しない場合 (ヘルプ ファイルによると)、exe を作成します。

Delphi 4 または Delphi 6 には同様のオプションがないため、Delphi 5 で導入され、Delphi 6 で修正されたと推測されます。

于 2011-04-25T12:02:24.703 に答える
1

Delphi 5 時代 (Delphi 4 または Delphi 6 の可能性があります) のどこかで、不正な .dcu ファイル (実際に .pas ファイルがあった) が IDE にあったときに、同様のことを覚えています。

ビルド前に .DCU ファイルを削除すると、問題が解決しました。

また、ウイルス対策ソフトウェアは、システムに対してタイミング関連の非常に悪いことを行う可能性があります。私の開発システムのほとんどは、その理由だけでアンチウイルスのない仮想マシンにあります。

クリーン マシンで Delphi 5 dcc32 の問題を再現してみてください(必要な Windows と Delphi コンポーネントだけです)。

それが機能する場合は、 Michał Niklas が提案したように、 Process Monitorを使用してそれらのマシン間の違いを確認します。

于 2011-03-16T12:44:04.720 に答える