2017-04-05 9 views
0

P1.dprojP2.dproj의 두 패키지를 만들었습니다.컴파일러가 현재 패키지에 속하지 않는 DCU를 유닛 출력 디렉토리에 두는 이유는 무엇입니까?

P1Unit1.pas이고 P2Unit2.pas 인 패키지에 두 개의 빈 단위를 넣었습니다.

각 패키지의 단위 출력 디렉토리를 .\P1\$(Platform)\$(Config).\P2\$(Platform)\$(Config)으로 편집했습니다.

P2 프로젝트에 대한 참조로 P1을 추가하여 P2가 P1에 종속되도록했습니다.

프로젝트 파일은 같은 폴더에 저장됩니다.

디렉토리 구조는 다음과 같다 : I 종속성 P1은 Packages\P1\Win32\Debug\Unit1.dcu를 출력하고, P2는 Packages\P21\Win32\Debug\Unit2.dcu 출력 된 추가

Root\ 
    Source\ 
     P1\ 
     Unit1.pas 
     P2\ 
     Unit2.pas 
    Packages\ 
     P1.dpk 
     P1.dproj 
     P2.dpk 
     P2.dproj 
     P1\ 
     Win32\ 
      Debug\ 
     P2\ 
     Win32\ 
      Debug\ 

전에.

예기치 않은 결과가 없습니다.

P2를 빌드 할 때 종속성을 추가하면 IDE에서 자동으로 P1도 컴파일되지만 파일은 이제 Packages\P2\Win32\Debug\Unit1.dcu에 출력됩니다.

왜 그럴까요?

Unit1.dcu 파일이 P2.drojContains 목록에 없으며 어떤 라이브러리 경로 또는 찾아보기 경로에도 나열되어 있지 않습니다 (Delphi는 아니며 프로젝트 로컬도 아닙니다).

컴파일러가 현재 프로젝트의 단위 출력 디렉토리에 원본 디렉토리에 대한 액세스 권한이없는 이유는 무엇입니까?

P1 dpk/dproj 파일을 일부 하위 폴더로 옮기고 IDE를 다시 시작하면 올바르게 P1.dcp 파일을 찾을 수없고 P1에서 컴파일을 시작하지 않는다고 불평 할 것입니다.

나는 더 큰, 더 복잡한 설정에서이 동작을 발견했다 그리고 ... 나를 미치게했다

+0

베를린과 중복 할 수 없습니다. 그룹에 새 프로젝트를 추가하고 종속성을 추가했습니다. 두 프로젝트 모두에 대해 컴파일되고 컴파일 된 DCU는 정확한 위치에 저장됩니다. – FredS

+0

특히 프로젝트는'packages'이어야하며 한 패키지에서 다른 패키지로 참조를 생성해야합니다 (프로젝트 그룹의 depedency 빌드가 아님). –

+0

@ JensMühlenhoff - P1의 Project Options에서 "Build Control"설정을 사용하여이를 제어 할 수 있습니다. 기본값은 "필요할 때 다시 빌드"입니다. "Explicit rebuild"로 변경하면이 동작을 방지 할 수 있습니다. (방금이 답변을 업데이트했습니다) –

답변

1

두 패키지의 소스 파일이 같은 디렉토리 에 있고 P1이 설정되어 있기 때문에이 일 것 "Rebuild as needed"옵션은 Project options에 있습니다.

유닛 U1을 포함하고 사용하는 간단한 프로젝트 Proj1에 대해 생각해보십시오. U1은 U12를 사용하며 이 아니고 Proj1에 포함 된입니다. 컴파일러는 U2.dcu를 볼 수 있어야합니다. 아마도 현재 라이브러리 경로 또는 다른 일반적인 "lib"디렉토리에있을 것입니다. Proj1이 컴파일되면 U1.dcu는 Proj1의 단위 출력 디렉토리로 들어가지만 U2.dcu는 현재 살고있는 곳에서 "사용"되고 Proj1의 출력 디렉토리에는 나타나지 않습니다.

이제 U2.pas가있는 디렉터리를 Proj1의 검색 경로에 추가한다고 가정합니다. 이제 컴파일러는 U2.pas를 볼 수 있으므로 컴파일하고 U2.dcu와 함께 결과물 인 U2.dcu를 Proj1의 단위 출력 디렉토리에 저장합니다.

P2는 "P1"과 동일합니다. 즉, P2를 컴파일 할 때 컴파일러는 P1.DCP 또는 P1 (P1.이 경우 dpk 및 unit1.pas).

동일한 디렉토리에 있기 때문에 P1.dpk를 볼 수 있으므로 컴파일하여 P2의 단위 출력 디렉토리에 결과 dcu (이 경우 unit1.dcu)를 배치합니다.

P1을 프로젝트 옵션에서 "명시 적으로 다시 작성"으로 설정하면이 동작을 방지 할 수 있습니다. P2 나 P1을 "필요로하는"패키지를 만들 때 컴파일러에게 "P1 소스를 볼 수는 있지만 빌드하지 마십시오."라고 알려줍니다.

+0

마지막 단락을 제외하고 모두 의미가 있습니다. 왜 컴파일러는 P1을 빌드하려고하지 않고 대신 U1을 빌드하기로 선택합니까? 만약 Unit1.pas가 몇몇 include/lib/어떤 환경 디렉토리에 있다면, 나는 그것이 "이해할 수있다"는 것을 알 수 있었다. (실제로 필자는 컴파일러가 현재 프로젝트의 일부가 아닌 ** 아무것도 컴파일하지 않기를 원한다. 하지만 그것은 내 개인적인 견해 일뿐입니다). 그러나 이것은 저에게 너무 먼 단계입니다. –

+0

나는 프로젝트 파일을 다른 디렉토리로 분리해야한다고 생각한다. * 한숨 *. –

+0

더 큰 프로젝트 그룹에서 이것은 실제로 여러 번 컴파일 된 유닛을 이끌었고 결국에는 '다른 버전으로 컴파일되었습니다'라는 오류 메시지가 나타납니다. –