2014-07-14 3 views
2

내가 가진 :CMake 프로젝트 공유 의존성

  • X에게 X와 Y
를 모두 사용
  • 실행 Z를 사용하여,
  • 공유 라이브러리 Y 독립적 인 공유 라이브러리 X,

    모두 자체 CMakeLists.txt가 있으며 독립적으로 구성 및 구축 할 수 있습니다.

    그러나 실행 파일 (Z)에 대한 CMakeLists.txt를 작동시키지 못합니다. OWN_LIBS 프로젝트 Y 단지 "X"되고, 프로젝트 Z.에서 "XY"를 인으로

    foreach(clib ${OWN_LIBS}) 
        set(LIBS "${LIBS} ${clib}") 
        set(CLIB_DIR "${PROJECT_SOURCE_DIR}/../lib${clib}") 
        set(CLIB_BUILD_DIR "${CLIB_DIR}/build") 
    
        add_subdirectory("${CLIB_DIR}" "${CLIB_BUILD_DIR}") 
        include_directories("${CLIB_DIR}/incl") 
        link_directories("${CLIB_BUILD_DIR}") 
    endforeach(clib) 
    

    이 프로젝트 Y를 위해 작동하지만, 프로젝트 :

    내 방법이있다 Z, 내가 얻을 :

    CMake 오류에 ... (add_subdirectory) : 바이너리 디렉토리

    .../libX/build 
    

    은 이미 소스 디렉토리를 작성하는 데 사용됩니다. 고유의 바이너리 디렉토리 이름을 지정 빌드 소스 디렉토리

    .../libX 
    

    에 사용할 수 없습니다.

    로컬 빌드 디렉토리를 만들려고했는데, 예를 들어. 이있을 것 libY/빌드/deps-libX/(Y에서 사용)을 구성하고 내장 된 라이브러리 X를 포함, Z는 모두 X이를 가지고와 Y 불행하게도, 다음에 내가 다 퉜다 :

    add_library 같은 이름의 다른 대상이 이미 존재하므로 "X"대상을 만들 수 없습니다. 기존 대상은 소스 디렉토리 "libX"에서 작성된 공유 라이브러리입니다. 자세한 내용은 CMP0002 정책에 대한 설명서를 참조하십시오.

    ExternalProject 사용은 옵션이 아닙니다.

  • +0

    결국 결국 http://stackoverflow.com/a/11217008/128240에 나와있는 솔루션을 사용하여 끝났습니다. – ShdNx

    +0

    [CMake - 동일한 프로젝트의 응용 프로그램/라이브러리 간의 종속성 (헤더)] 가능한 복제본 (http://stackoverflow.com/questions/11216408/cmake-dependencies-headers-between-apps-libraries-in-same-project) – ShdNx

    답변

    0

    X 님의 CMakeLists.txt가 2 번 처리됩니다 (과 Y 모두에서 add_subdirectory(X)이 호출 됨). 즉, Z의 CmakeLists에서 add_subdirectory(X)를 호출 할 필요는 없습니다이 링크 상황

    Z-->Y--->X 
    --------^ 
    

    에 대한 정책 CMP0002을 위반 대상 X 정의를 여러 번, (X는 전 세계적으로 고유하지 않습니다)

    한다.

    Z/CmakeLists.txt 
        add_subdirectory(Y ...) 
    
    Y/CmakeLists.txt 
        add_subdirectory(X ...) 
    
    +3

    그래,하지만 이상적으로 나는 Z가 Y에 의존한다는 사실을 Z가 알기를 원하지 않을 것이다. Z의 유일한 관심은 X와 Y를 모두 사용해야한다는 것이다. 이렇게하는 강력한 방법이 있는가? – ShdNx

    +0

    'X '와'Y'는 [package]에있을 수 있습니다 (http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries) – Peter

    0

    다른 사람에 대한 추가 대답이 txt :

    나는 때문에 병합 "오류"의 오류가 발생했습니다. 더 큰 프로젝트에서, 병합 후에 CMakeLists.txt는 동일한 서브 디렉토리에서 두 번 "add_subdirectory"를 호출했습니다. 동일한 오류 메시지가 발생합니다.