2016-06-09 5 views
2

examples 폴더와 함께 제공되는 C++ 라이브러리 프로젝트가 있습니다. 예는 독립형입니다. 즉, 소스 트리의 나머지 부분없이 라이브러리를 사용하는 실제 애플리케이션 인 것처럼 컴파일 할 수 있습니다. 제공된 FindMyLib.cmake을 사용하여 시스템에 설치된 라이브러리를 찾습니다.cmake 프로젝트를 하위 프로젝트에 연결할 수 있습니까?

전체 라이브러리와 함께 빌드 할 수 있습니다.

if(MYLIB_BUILD_EXAMPLES) 
    add_subdirectory(examples/fooexample) 
    add_subdirectory(examples/barexample) 
endif() 

을하지만 라이브러리를 설치하기 전에 내가 find_package를 사용할 수 없기 때문에이 작동하지 않습니다 수 있습니다 : 처음에, 나는 서브 디렉토리로 추가. 검색 경로에 기본 빌드 디렉토리를 추가 할 수는 있지만, cmake가 실행되는 동안 라이브러리가 아직 빌드되지 않았으므로 충분하지 않습니다 (분명히).

이 문제를 해결하려면 어떻게해야합니까? 라이브러리를 빌드하는 동안이 서브 프로젝트에 라이브러리를 투명하게 링크 할 수있는 방법이 있습니까 (또한 설치하지 않고 실패 할 가능성이 있으므로 find_package를 "비활성화").

답변

2

그냥 빌드 트리를 사용하여 라이브러리에 링크 가짜FindMyLib.cmake을 준비 아닌 하나를 설치합니다.

cmake 빌드/FindMyLib.cmake : 예를 들어,이 라이브러리 대상에 변수 MyLib_LIBRARY 변수를 설정할 수 있습니다

set(MyLib_LIBRARY MyLib) 
set(MyLib_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/include) 
... 

그런 다음 디렉토리와 CMAKE_MODULE_PATH 목록을 앞에 추가 가짜 스크립트가 포함되어 있습니다. 이러한 방법은이 예에서 사용됩니다

if(MYLIB_BUILD_EXAMPLES) 
    set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake-build ${CMAKE_MODULE_PATH}) 
    add_subdirectory(examples/fooexample) 
    add_subdirectory(examples/barexample) 
endif() 
+0

내가 뭔가를 놓친하지 않는 한,이 작동하지 않습니다 라이브러리가 아직 구축되지 않기 때문에 라이브러리가 add_library (MYLIB'로 (추가 된 경우의 예에 대한 구성 단계는, 오류로 – piwi

+0

을 이끌 것입니다) ') * before *'add_subdirectory (examples/...)','target_link_libraries (fooexample $ {MyLib_LIBRARY})'는 ** target **과 보통 연결로 작동합니다. 라이브러리 타겟은이 단계에서 빌드 할 필요가 없습니다. – Tsyvarev

+0

불편을 끼쳐 드려 죄송합니다. – piwi

1

해결책이 MyLib을 구축 대상이 존재하는지, 당신의 예에서, 확인하고 종속성이 않는 경우로 사용 될 수있다; 그렇지 않으면 find_library()을 호출하십시오.

add_library(MyLib ...) 

# examples/fooexample 
if(NOT TARGET MyLib) 
    find_library(MyLib) 
endif() 

add_executable(foo) 

if(TARGET MyLib) 
    add_dependencies(foo MyLib) 
endif()