モノリシックアプリケーションをモジュール化するために、リリースビルド用に単一のexeファイルにコンパイルしながら、デバッグビルドで使用するパッケージを設定しています。ランタイムパッケージを使用してビルド中に「インポートされたデータ参照が必要」を解決する方法
私たちのパッケージ(EAUtils)の1つに、現在[DCC Error] E2201 Need imported data reference ($G) to access 'SMsgDlgWarning' from unit 'SystemUtils'
を生産しているユニットが含まれています。
これは、EAUtilsパッケージ自体をビルドするときに発生します。私はまだEAUtilsに依存するパッケージを作ることにはなっていません。 EAUtilsは、rtl/vclパッケージと、Jedi WinApiユニット用に作成したパッケージのみに依存します。
これは線の結果である:
// This is a TaskDialog override, with the same args as the old MessageDlg.
function TaskDialog(const aContent: string; const Icon: HICON = 0;
const Buttons: TTaskDialogCommonButtonFlags = TDCBF_OK_BUTTON): Integer;
const
Captions: array[TMsgDlgType] of Pointer = (@SMsgDlgWarning, @SMsgDlgError, @SMsgDlgInformation, @SMsgDlgConfirm, nil);
var
aMsgDlgType: TMsgDlgType;
aTitle: string;
begin
aMsgDlgType := TaskDialogIconToMsgDlgType(Icon);
if aMsgDlgType <> mtCustom then
aTitle := LoadResString(Captions[aMsgDlgType])
else
aTitle := Application.Title;
は、具体的にこれは全てVcl.Const
で宣言されSMsgDlgWarning
、SMsgDlgError
、SMsgDlgInformation
とSMsgDlgConfirm
を参照した結果です。
このコードは、単一の実行可能ファイルを作成する際にエラーなしでコンパイルされます。
最適化の手段として、私たちのインクルードファイルには{$IMPORTEDDATA OFF}
が含まれています。これにより(グローバル)変数と定数への高速アクセスが可能になります。 http://hallvards.blogspot.com/2006/09/hack13-access-globals-faster.htmlを参照してください。
エラー(http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/cm_package_varref_xml.html)のドキュメントによると、これが原因で、「問題を緩和するには、通常、$ IMPORTEDDATAスイッチをオンにして、エラーを生成するユニットを再コンパイルするのが最も簡単です。
私はインクルードファイルに{$IMPORTEDDATA ON}
を設定しており、プロジェクトオプションのDelphi Compiler | Compiling | Debugging
セクションにUse imported data references
をtrueに設定することで二重に確認しました。
残念ながら、ドキュメントに反して、これは問題を緩和しませんでした。このコンパイラ指令を問題のコードの真上に設定してパッケージを再構築しても、エラーは削除されませんでした。
このE2201エラーを解決するには他に何が必要ですか? SMsgDlgWarningとそのフレンドがリソース文字列であることが重要なのでしょうか?
パッケージをコンパイルするときにこのエラーが発生することがありますが、ビルドは常に機能します。 – jpfollenius
@Smasher:ありがとう、私はビルドしました。条件付きの定義とあまりにも多くの手間がかかっていて、ちょうどコンパイルされているので、Shft-F9は私の指の中にあります。 –
'$ IMPORTEDDATA'を付けたユニットを含む元のパッケージを再構築しても、依存するパッケージをビルドするときに結果の.dcuと.dcpを使用していることを確認してください。 –