2017-03-02 2 views
1

(기존 설치된 버전을 사용하는 대신) 소스에서 gtest를 컴파일하려고합니다. 저는 catkin 기반의 cmake 프로젝트를 진행하고 있습니다.catkin을 사용하여 소스에서 gtest 컴파일

소스 코드를 https://github.com/google/googletest에서 내 작업 영역에 추가하고 add_subdirectory 폴더를 포함 시켰습니다. 다른 게시물에서

CMake Error at src/test_env/GTest/googletest/cmake/internal_utils.cmake:151 (add_library): 
    add_library cannot create target "gtest" because another target with the 
    same name already exists. The existing target is a shared library created 
    in source directory "/usr/src/gtest". See documentation for policy CMP0002 
    for more details. 

하고 googletest 지침 자체 (https://github.com/google/googletest/tree/master/googletest#incorporating-into-an-existing-cmake-project) 나는이 문제 없어야 이해 :

는 그러나, 나는 기존의 gtest와 nameclash를 얻을.

catkin이 gtest를 처리하는 방법에 문제가 있다고 생각합니다. 그리고, 틀림없이, 일반적으로 나는 설치된 버전을 사용할 수 있습니다. 하지만 모든 사람들이 동일한 (번들로 묶인) gtest 버전을 사용하고 있는지 확인하고 싶습니다.

모든 제안과 힌트를 환영합니다.

+0

'catkin이 gtest를 처리하는 방법에 문제가있는 것 같아요. '- Catkin은'add_subdirectory'를 통해 같은 방식으로 gtest를 포함합니다. 그러나 동일한 프로젝트는 일반적으로 동일한 소스 트리에서 두 번 포함 할 수 없습니다 **. 그래서 그 오류가 발생합니다. [그 질문] (http://stackoverflow.com/questions/42085151/cmake-conflict-with-multiple-gtest)와 비슷합니다. – Tsyvarev

답변

1

오류 메시지는 실제로 매우 분명합니다. cmake "target"은 "빌드에 의해 생성 될 것"이며, 라이브러리, 실행 파일 또는 다른 것입니다. 그래서 문제는 "gtest"라는 타겟을 추가하려고 시도하고 catkin이 이미 동일한 작업을 수행하고 있다는 것입니다. 둘 다 라이브러리 "libgtest.so"를 생성하며, 물론 같은 폴더에있는 라이브러리 중 하나만있을 수 있습니다. googletest/CMakelists.txt에 대상 이름을 변경하여 "your"gtest의 이름을 바꿀 수는 있지만 그렇게하지 않는 것이 좋습니다.

제 생각에 gtest는 공유 라이브러리가 아니어야합니다. 특히 저장소의 여러 프로젝트에 다른 빌드 플래그를 사용하는 경우 특히 그렇습니다. 대체 방법이 있는데, 기본적으로 폴더에 gtest 소스 코드를 포함시킨 다음 유닛 테스트 main.cpp에 헤더 파일과 소스 파일을 포함시킵니다. googletest는 이미 도우미와 함께 제공됩니다 (src/gtest-main.cc).

  1. 가 (당신은 자식을 사용하는 경우) 자식에 서브 모듈로 원하는 gtest 버전을 추가

    이 내가 그것을 구조 것이 방법이다. 이렇게하면 repo에있는 모든 프로젝트에 대해 지정된 버전이 있고 다른 분기에서 업데이트 할 수 있습니다. 그 폴더를 "GTEST_DIR"이라고 부를 것입니다.

  2. .cpp 파일에 unittests 쓰기 #include <gtest/gtest.h>, 테스트 할 hpp 당 및 #include이 모두 hpp하고 test.cppcpp. 이렇게하면 다른 클래스에서 테스트를 분리하고 매우 가짜 또는 위조 된 객체가있는 종속 클래스를 쉽게 전환 할 수 있습니다. gtest-main.cc에 이미 있으므로 main() 함수가 필요하지 않습니다.

    물론
    macro(add_gtest NAME FILES) 
    add_executable(my_gtest_$NAME 
        $FILES 
        GTEST_DIR/src/gtest.cc 
        GTEST_DIR/src/gtest-death-test.cc 
        GTEST_DIR/src/gtest-filepath.cc 
        GTEST_DIR/src/gtest-port.cc 
        GTEST_DIR/src/gtest-printers.cc 
        GTEST_DIR/src/gtest-test-part.cc 
        GTEST_DIR/src/gtest-typed-test.cc 
        GTEST_DIR/src/gtest-main.cc 
    ) 
    target_include_directories(my_gtest_$NAME GTEST_DIR/include) 
    endmacro() 
    

, 당신이 더 복잡하거나 덜 복잡 할 수 있지만, 그 요지입니다 :

  • 이 같은 cmake 매크로를 작성합니다. 물론 gtest를 공유 라이브러리로 사용하는 것보다 컴파일 시간이 길어질 것입니다. 그러나 실제로는 여러분의 유닛이 분리되어 테스트되도록해야합니다. 이것은 제 의견으로는 매우 중요합니다. 또한 ccache을 사용하면 gtest 오브젝트 파일이 절대로 변경되지 않기 때문에이 시나리오에서 컴파일 시간을 크게 향상시킬 수 있습니다. 또한 이것은 gtest가 정확히 원하는 플래그로 컴파일되었는지 확인합니다.예를 들어 동일한 클래스에 대해 두 개의 개별 단위 테스트를 만들 수 있습니다. 하나는 예외가 활성화 된 테스트이고 다른 테스트는 수행되지 않은 테스트입니다.

    +0

    자세한 솔루션을 제공해 주셔서 감사합니다. 내 생각 엔, 그것이 내가해야 할 일이다. – cbandera

    관련 문제