The Delphi Bug List

Entry No.
625号
コンパイラ - リンカ
あるユニット(例 suspectunit.pas)でコンパイラ指令子 {$objexportall on} を使用すると DCC32 がリンク段階で失敗し、エラーメッセージは出ず、.dcu だけを生成して .exe を生成しない
1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 4.03 5.0 5.01 6.0 6.01 6.02 Kylix 1.0
N/A N/A N/A N/A N/A Exists Exists Exists Exists Exists Exists Exists Exists Exists Unknown
解説
Reported by Marc Durdin; checked by Jordan Russell
あるユニット(例 suspectunit.pas)でコンパイラ指令子 {$objexportall on} を使用すると DCC32 がリンク段階で失敗します。エラーメッセージは出ず、.dcu だけを生成して .exe を生成しません。リンク統計も間違っています。しかしながら suspectunit.dcu がすでに存在し、なおかつ最新の場合、DCC32 は正常にリンクを行います。

再現性:
この問題は、コマンドラインコンパイラ DCC32 で .PAS ユニットをコンパイルする場合に必ず発生します。対応する .DCU が最新の場合には発生しません。

問題を再現する手順:
  1. 以下のような単独のユニットを持つ空のプロジェクトを生成します:
             unit SuspectUnit;
    
             interface
    
             {$objexportall on}
    
             implementation
    
             end.
    
  2. DCC32 を使ってコンパイルします。
             DCC32 suspect.dpr
    
    エラーは出力されませんが、実行体は生成されていません。


理由:
エラーメッセージは出力されませんが、リンカはユニットのリンクを拒否します。また、間違ったコードサイズとデータサイズの統計情報を出力します。

OS:
このバグは WinNT4、Win2000、Win98 で再現します。
解決策 / 回避方法
  1. (推奨) コンパイラフラグに条件を付けてください:
  2.        {$ifndef VER120}
             {$ifndef VER130}
               {$ObjExportAll on}
             {$endif}
           {$endif}
    
  3. 1回目のビルドの後に、プロジェクトを再リンクしてください(DCC32 を2回実行する)。
Latest update of this entry: 2002-04-09
本家 The Delphi Bug List のエントリーはこちら
The Delphi Bug List 日本語訳 へ