2017-11-17 3 views
0

나는 다음과 같은 프로젝트 구조가 있습니다SCons는이 해결하지 못한 상대 소스 경로

/prj 
    SConstruct 
    /src 
     /app 
     /lib1 
     /lib2 
     /... 

'/ PRJ/SRC/LIB1'구조 :

/lib1 
    /src 
    /test 
    SConscript 

'LIB1/SConscript'

SConscript('test/test1/SConscript', 
      exports = 'env', 
      variant_dir = '#build/release/lib1/test', 
      duplicate = 0) 

그리고 마지막으로 'test'디렉토리 :

'테스트/TEST1/SConscript'소스에서

지정 등 :

Sources = ['../common/helpers.cpp', 'main.cpp'] 

결과 :

scons: *** [build/release/lib1/common/helpers.o] 
Source `build/release/lib1/common/helpers.cpp' not found, 
needed by target `build/release/lib1/common/helpers.o' 
로 볼 수 있습니다 문제는 SCons는 소스 파일 '도우미를 찾습니다이다

.cpp '는 소스 디렉토리가 아니라 빌드 디렉토리에 있습니다.

일부 연구에 따르면 소스 파일 경로가 '../'로 시작될 때 발생하는 문제를 보여줍니다. 'SConscript'파일 아래에 정의 된 모든 소스가 모두 Ok 일 때.

Scons v2.5.1 및 v3.0.1은 동일한 동작을 보여줍니다.

내가 뭘 잘못 했니? 당신은 파일 이름

로 ../test.cpp 사용할 수

그러나 나는 정확히 같은 일을 : 저자는 조언 어디 this answer을 발견했습니다. 그러한 스콘 동작이 의도 된 것이거나 이것이 버그입니까? "lib1/SConscript"에서

답변

0

귀하의 "코드"

SConscript('test/test1/SConscript', 
      exports = 'env', 
      variant_dir = '#build/release/lib1/test', 
      duplicate = 0) 

이의 이름을 사용하는 "test/test1/SConscript는"암묵적 대상 디렉토리에 "변종 폴더"(= variant_dir)로 폴더 "test/test1를"링크 제공 "#build/release/lib1/test". 따라서 필요한 파일이 ""에 없으면 SCons은 "test/test1/"에서 다른 "조회"를 시도합니다. 그러나이 링크는 "common"폴더에도 자동으로 설정되지 않으므로 "helpers.cpp"의 조회가 실패하는 것입니다. 이는 의도 한 동작이며 SCons에서 수정하십시오.

SConscript('test/SConscript', 
      exports = 'env', 
      variant_dir = '#build/release/lib1/test', 
      duplicate = 0) 
:

현재의 문제에 대한 해결책으로 "lib1/SConscript"에서이 새로운 SConscript를 이동 "test/test1/SConscript"한 폴더 수준 높은있다 "common/helpers.cpp"로 소스를 포함하고 "test/main.cpp"하고 전화를하는 것입니다

+0

네가 제공하는 것처럼 문제를 해결했다. (문제에 대한 나의 이해가 올라간다, 고맙다.) 유일한 단점은이 경우 필자는 모든 테스트 하위 프로젝트에 대한 정의를 'test'디렉토리 수준에있는 동일한 SConscript 파일에 넣어야한다는 것입니다. 이는 많은 테스트가 필요할 때 불편할 수 있으며 테스트 바이너리를 별도로 빌드 할 수있는 능력 대신 모든 테스트 프로젝트를 구축하는 그러한 접근 방식 커플이 더 중요합니다. –

+0

1) 명령 줄에서 "scons build /.../ testa build /.../ testb'"라는 인수로 단일 (또는 여러 개의) 대상을 지정할 수 있습니다. 2) 여러 개의 SConscript를 가질 수 있으며 "scons -f SConscript.testa"를 통해 이들 사이를 선택할 수 있습니다. 3) 프로젝트 설정은 위에서 예로 든 것과 같이 항상 "공통"소스에서 별도의 라이브러리를 만드는 것이 좋습니다. 그런 다음 환경의 LIBS 변수에이를 추가하고 테스트 프로그램을 직접 빌드 할 수 있습니다. 이보다 더 가볍지는 않습니다. 그냥 당신에게 더 많은 아이디어를 줄 수 있습니다. ;) – dirkbaechle

+0

'공통'소스에서 라이브러리를 만드는 것이 좋은 생각입니다. 감사합니다! '../'의 경로에있는 파일이 scons에 문제가 없다는 것을 올바르게 이해합니까? 나는. 예를 들어, 프로젝트가 헤더 파일 (Q_OBJECT 매크로 포함)을 여러 레벨 (주 프로젝트 포함 디렉토리)에있는 경우, scons가 'variant_folder'를 올바르게 해결하고이 파일에 대해 moc를 시작합니다. –