2011-03-16 8 views
-1

저는 빌드를 수행하기 위해 Delphi 5 명령 줄 컴파일러를 사용하고 있습니다. 빌드는 오류를보고하지 않지만 EXE 파일도 생성하지 않습니다.DCC32 명령 줄 컴파일러가 성공적으로 완료되었지만 EXE 파일을 생성하지 않습니다.

나는 다음을 확인 할 수 있습니다

  • IDE에서 제대로 동작을 통해 동일한 빌드를 수행.
  • IDE 대 DCC32 빌드 사이의 소스 코드 나 옵션에는 차이가 없습니다.
  • 문제는 전체 빌드에서만 발생합니다. 나는. -B 옵션을 사용하여 빌드를 수행 한 후 '컴파일'을 올바르게 수행하면 EXE 파일이 올바르게 생성됩니다.
  • 명령 줄에서 -E 스위치를 사용하여 잘못된 빌드 출력 경로를 강제로 설정하더라도 EXE 파일을 생성하려고 시도하지 않은 것처럼 오류를보고하지 않습니다.
  • 다른 프로젝트가 올바르게 빌드됩니다.
  • 바이러스 백신 소프트웨어를 사용하지 않도록 설정 했으므로 바이러스 백신 소프트웨어가 문제가 아님을 확인할 수 있습니다. 델파이 5 이것을 경험하지만

편집 는, 그 버전에 없습니다. Delphi Bug List은 적어도 D4-D6에서 문제를 확인했습니다.

+0

Windows의 버전, SP 수준 및 A/V 소프트웨어는 무엇입니까? A ​​/ V 비활성화는 ev가 아닙니다. 일부 브랜드의 A/V 소프트웨어를 사용하여 문제를 해결할 예정이라면 추적없이 앱을 완전히 제거해야 앱이 손상되지 않았을 것입니다. –

답변

2

오랜 조사 끝에 문제를 정확히 파악했습니다.

  • 빌드를 수행하고 EXE를 확인하고 성공 또는 실패를보고하는 약간의 배치 파일을 작성했습니다.
  • 그런 다음 한 번에 하나씩 종속성을 제거하고 빌드를 다시 테스트하는 힘든 과정을 겪었습니다.
  • 결국 제 3 자 패키지 중 일부에서 사용 된 특정 컴파일러 지시문 {$ObjExportAll ON}으로 이동했습니다.
  • 인터넷을 검색하면 $ ObjExportAll이 BCB 지원을 위해 추가되었을 때이 버그가 도입 된 것으로 나타났습니다. .

    : -이 거의 발생되지 않은 것으로 보이지만 그냥 내 행운 :(
  • 나는 버그가 수정 된 버전의 경우 또는 확실 해요

다음과 같은 간단한 프로젝트와 버그를 테스트 할 수 있습니다 EXE 파일을 DCC32 만들지 않습니다 지침에

program TestDCC32ObjExportAll; 

{$OBJEXPORTALL ON} 

begin 
end; 
  • . 지시어없이
  • 는 EXE를 작성하지 DCC32.
  • 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은 무슨 일이 일어나는지 알아 내야합니다. –

+0

+1 정말 유용한 정보가 없지만 새로운 것을 알려주지는 않습니다. dcc32는 EXE 파일을 쓰려고 시도조차하지 않고 있습니다. –

+0

@Ken : 잘못된 논리로 인해 오른쪽 구멍이 무시 되었기 때문에 지금주의 깊게 생각하면 틀린 토끼 구멍 아래에서 많은 시간 낭비하게됩니다. ;) 나는 다른 프로젝트가 제대로 빌드되었음을 나타내므로 dcc32의 버그는 다른 특별한 조건이 충족되어야합니다. (내 대답을 참조하십시오) –

1

불량의 .dcu 파일 (.pas 파일이있는 파일)이있을 때 IDE에서 델파이 5 시대 (델파이 4 또는 델파이 6 일 수도 있음)의 어딘가에서 비슷한 것을 기억합니다.

빌드하기 전에 .DCU 파일을 삭제하면 문제가 해결됩니다.

또한 안티 바이러스 소프트웨어는 시스템에 실제로 나쁜 타이밍 관련 작업을 수행 할 수 있습니다. 이미 그랬습니다 : 대부분의 개발 시스템은 그 이유만으로 안티 바이러스가없는 가상 머신에 있습니다.

깨끗한 컴퓨터 (Windows 및 Delphi 컴포넌트 만 필요함)에서 Delphi 5 dcc32 문제를 재현 해보십시오.

이것이 작동하는 경우 Process Monitor을 사용하면 Michał Niklas가 제안한대로 해당 컴퓨터의 차이점을 확인할 수 있습니다.

1

는 나는 (D5 작동 사람들을 위해) 매우 알려진 문제가 될 수있다 생각합니다.

예를 들어

는 FinalBuilder는 "델파이 프로젝트를 빌드"행동 "델파이 5 컴파일러의 버그에 대한 사용 해결 방법을"포함 , 이는 두 가지 옵션으로 프로젝트를 두 번 빌드합니다. 특히 dcc32가 도움말 파일에 따라 생성하지 않을 때 exe를 생성합니다.

Delphi 4 또는 Delphi 6과 비슷한 옵션이 없으므로 Delphi 5에서 처음 소개되었으며 Delphi 6에서 수정되었습니다.

+0

귀하의 기여에 감사드립니다. 예, 한 가지 해결 방법은 빌드 (모든 DCU 생성) 한 다음 컴파일하는 것입니다. 그러나 Delphi 버그 목록은 D4-D6에서 확인 된 것으로 문제를보고합니다. 내 대답을 업데이트로 표시했습니다. –

관련 문제