모 놀리 식 응용 프로그램을 모듈화하는 데 도움이되도록 디버그 빌드에서 사용할 패키지를 설정하는 중이고 릴리스 빌드에 대해 하나의 EXE 파일로 컴파일하는 중입니다. .런타임 패키지로 빌드하는 동안 "가져온 데이터 참조가 필요합니다"를 해결하는 방법
우리 패키지 중 하나 (EAUtils)에는 현재 [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 스위치를 켜고 오류를 생성하는 장치를 다시 컴파일하는 것이 가장 쉽습니다."
그래서 프로젝트 파일의 Delphi Compiler | Compiling | Debugging
섹션에 Use imported data references
을 true로 설정하여 {$IMPORTEDDATA ON}
을 포함 파일에 설정하고 이중 설정을 확실하게했습니다.
문서와 달리 불행히도 문제가 완화되지 않았습니다. 문제가되는 코드 바로 위의이 컴파일러 지시문을 설정하고 패키지를 다시 작성해도 오류가 제거되지 않았습니다.
이 E2201 오류를 해결하려면 무엇이 필요합니까? 확실치 않지만 SMsgDlgWarning과 그 친구가 리소스 문자열이라는 것이 중요 할 수 있습니까?
패키지를 컴파일 할 때이 오류가 발생하지만 건물이 항상 작동합니다. – jpfollenius
@Smasher : 고마워.하지만 내가 지었다.조건부 정의와 너무 많은 번거 로움을 겪고 Shock-F9가 내 마음에 들었습니다 :-) –
'$ IMPORTEDDATA'가있는 유닛을 포함하고있는 원본 패키지를 다시 빌드하면 오류가 발생하지 않아야합니다. 종속 패키지를 빌드 할 때 결과 .dcu 및 .dcp를 사용하고 있는지 확인하십시오. –