2012-10-14 4 views
2

최종 출력이 정적 라이브러리 인 프로젝트를 빌드하고 CMake 기반 빌드 시스템은 Src와 Tests라는 두 개의 서브 디렉토리로 구성됩니다. 테스트 용 빌드는 실행 파일을 생성하고 src에서 빌드 된 라이브러리에 링크합니다.CMake로 아직 빌드되지 않은 라이브러리에 연결

제 문제는 오류없이 진행하려면 테스트 빌드에서 라이브러리가 이미 있어야한다는 것입니다. CMake가 테스트를 빌드 할 때 라이브러리가 존재한다는 것을 이해할 수있는 방법이 있습니까? 아니면 별도의 단계로 라이브러리를 수행해야합니까?

내 CMakeLists.txt 파일을 다음과 같이

루트 파일 :

cmake_minimum_required(VERSION 2.8) 
project(mylib) 
add_subdirectory(Src) 
add_subdirectory(Tests) 

의 Src 파일 :

file(GLOB MYLIB_SOURCES *.cpp) 
add_library(mylib ${MYLIB_SOURCES}) 

테스트 파일 :

file(GLOB MYLIB_TESTS *.cpp) 
add_executable(tests ${MYLIB_TESTS}) 

find_package(GTest REQUIRED) 
find_library(LIB_MYLIB NAMES mylib PATHS "${CMAKE_SOURCE_DIR}/Build/Src") 

include_directories(../Src) 
include_directories(${GTEST_INCLUDE_DIRECTORIES}) 

target_link_libraries(tests ${LIB_MYLIB} ${GTEST_LIBRARIES} pthread) 
+3

왜 mylib에 대해 명시적인 find_library가 필요합니까? 추가 요구 사항이 없으면 필요하지 않습니다. 아마 target_link_libraries (mylib 테스트)를 직접 지정할 수 있습니다. 그런 식으로 CMake는 테스트가 mylib에 달려 있다는 것을 알게 될 것이고 mylib가 테스트 빌드를 시작하기 전에 만들어 졌는지 확인할 것입니다. –

+0

병렬 디렉토리에서 mylib를 찾을 수 있습니까? 난 단지 그것을 Src에서 정의하고 테스트 빌드 파일은 그것에 대해 모른다. 그게 문제가 될까요? –

+0

그러나 부모 CMakeLists는 add_subdirectory를 통해 두 대상을 모두 알고 있습니다. 물론 루트 파일에서만 cmake를 호출해야하며 테스트에서는 별도로 호출하면 안됩니다. 내 의견을 반영하기위한 답을 만들 것입니다. –

답변

3

CMake가되어야한다 의존성을 알아낼 수있다. 물론 Src와 Tests 사이의 ency는 물론 CMake를 루트 CMakeLists.txt에서만 호출합니다. find_library가 실제로 필요하지 않습니다.

그래서 저는 Src CMakeLists.txt를 다음과 같이 유지할 것입니다. 거기에 MyLib_INCLUDE_DIRS '을 설정하고 캐시에 강제 :

project(MyLib) 
file(GLOB MYLIB_SOURCES *.cpp) 
add_library(mylib ${MYLIB_SOURCES}) 
# I do not know 
set(mylib_INCLUDE_DIRS ${MyLib_SOURCE_DIR} CACHE STRING "Include-directories for MyLib" FORCE) 

하고 테스트 다시 CMakeLists.txt :

project(MyTests) 
file(GLOB MYLIB_TESTS *.cpp) 
add_executable(tests ${MYLIB_TESTS}) 

find_package(GTest REQUIRED) 
include_directories(${mylib_INCLUDE_DIRS}) 
include_directories(${GTEST_INCLUDE_DIRECTORIES}) 

target_link_libraries(tests mylib ${GTEST_LIBRARIES} pthread) 

만, 나는 당신에 CMake를 호출 제안 "테스트"를 구축하고자하는 경우 CMakeLists.txt 루트를 만들고 테스트 디렉토리로 들어가서 'make'또는 'msbuild'를 호출하십시오.

+0

답변 해 주셔서 감사합니다. :) –

관련 문제