2017-02-07 16 views
4

Это мое первое сообщение в StackOverflow, поэтому извиняюсь, если что-то не так с моим вопросом.CMake конфликт с несколькими gtest

Я новичок в CMake, и у меня возникает проблема с попыткой импортировать gtest (Google Test) в проект на C++ с существующим файлом gtest, который используется в библиотеке.

Моего файл корневого CMakeLists.txt это так (Мои изменения сделаны между «Началом изменений» и «Концом изменений»):

cmake_minimum_required(VERSION 2.6) 

project(nifi-minifi-cpp) 
set(PROJECT_NAME "nifi-minifi-cpp") 
set(PROJECT_VERSION_MAJOR 0) 
set(PROJECT_VERSION_MINOR 2) 
set(PROJECT_VERSION_PATCH 0) 

#### Establish Project Configuration #### 
# Enable usage of the VERSION specifier 
# https://cmake.org/cmake/help/v3.0/policy/CMP0048.html#policy:CMP0048 
IF(POLICY CMP0048) 
    CMAKE_POLICY(SET CMP0048 OLD) 
ENDIF(POLICY CMP0048) 

include(CheckCXXCompilerFlag) 
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) 
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) 
if(COMPILER_SUPPORTS_CXX11) 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
elseif(COMPILER_SUPPORTS_CXX0X) 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") 
else() 
     message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") 
endif() 

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 

# Search for threads 
find_package(Threads REQUIRED) 

# Provide custom modules for the project 
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 

add_subdirectory(thirdparty/yaml-cpp-yaml-cpp-0.5.3) 
add_subdirectory(libminifi) 
add_subdirectory(main) 

# Generate source assembly 
set(ASSEMBLY_BASE_NAME "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") 
set(CPACK_SOURCE_GENERATOR "TGZ") 
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${ASSEMBLY_BASE_NAME}-source") 
set(CPACK_SOURCE_IGNORE_FILES "/build/;~$;${CPACK_SOURCE_IGNORE_FILES};${CMAKE_SOURCE_DIR}/.git/;${CMAKE_SOURCE_DIR}/.idea/;${CMAKE_SOURCE_DIR}/cmake-build-debug/") 

# Generate binary assembly 
install(FILES conf/minifi.properties conf/config.yml 
     DESTINATION conf 
     COMPONENT bin) 

install(PROGRAMS bin/minifi.sh 
     DESTINATION bin 
     COMPONENT bin) 

install(FILES LICENSE README.md NOTICE 
     DESTINATION . 
     COMPONENT bin) 

set(CPACK_GENERATOR "TGZ") 
set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 1) 
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Apache NiFi MiNiFi C++ version ${VERSION}") 
set(CPACK_PACKAGE_VENDOR "Apache NiFi") 
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md") 
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 
set(CPACK_PACKAGE_FILE_NAME "${ASSEMBLY_BASE_NAME}") 
set(CPACK_BINARY_TGZ, "ON") 

set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) 
set(CPACK_COMPONENTS_ALL bin) 

include(CPack) 

#### Begin changes 
# Set up testing 
enable_testing() 
set(GTEST_ROOT "thirdparty/googletest/googletest") 
add_subdirectory(thirdparty/googletest) 
# 
find_package(GTest REQUIRED) 
include_directories(${GTEST_INCLUDE_DIRS}) 
add_executable(tailFileTest 
     test/TailFileTest.cpp 
     ) 
target_link_libraries(tailFileTest ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG}) 

add_test(
     NAME tailFileTest 
     COMMAND tailFileTest 
) 


#add_dependencies(${PROJECT_TEST_NAME} googletest) 

#set(PROJECT_TEST_NAME ${PROJECT_NAME}_test) 
#file(GLOB TEST_SRC_FILES ${PROJECT_SOURCE_DIR}/test/*.cpp) 
# 
#add_executable(${PROJECT_TEST_NAME} ${TEST_SRC_FILES}) 
#add_dependencies(${PROJECT_TEST_NAME} googletest) 
#### End changes 

И выходом из CMake при работе cmake .. (более соответствующее сообщение об ошибке - вероятно) является:

CMake Error at thirdparty/googletest/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 static library created 
    in source directory 
    "/home/dev/nifi-minifi-cpp/thirdparty/yaml-cpp-yaml-cpp-0.5.3/test/gmock-1.7.0/gtest". 
    See documentation for policy CMP0002 for more details. 

в настоящее время я получил копию googletest в:

/home/g/dev/nifi-minifi-cpp/thirdparty/googletest 

И существующий каталог googletest находится в пределах:

/home/g/dev/nifi-minifi-cpp/thirdparty/yaml-cpp-yaml-cpp-0.5.3/test/gmock-1.7.0 

Вот краткая картина структуры каталогов:

. 
├── CMakeLists.txt 
├── test        [<- My directory to store and run tests] 
└── thirdparty 
    ├── googletest     [<- My googletest directory] 
    └── yaml-cpp-yaml-cpp-0.5.3 
     ├── test 
     │   ├── CMakeLists.txt 
     │   ├── gmock-1.7.0   [<- The existing googletest directory] 

278 directories, 2096 files 

Общая цель состоит в том, чтобы иметь test каталог для выполнения тестов.

Любые предложения или подсказки к тому, что я делаю неправильно, или то, что я должен делать, будут очень признательны. Надеюсь, вышеописанное объясняет проблему, с которой я столкнулся, и если есть файл или сообщение об ошибке, люди думают, что мне не хватает, что поможет мне вставить его здесь.

+0

Почему у вас есть две папки googleTest (_My googletest directory_ и _The существующий каталог googletest_)? Возможно ли, что у вас в CMakeList из yaml-cpp-yaml-cpp-0.5.3 также есть запись add_subdirectory (gmock-1.7.0)? Это может быть проблемой, потому что ваше сообщение об ошибке говорит, что у вас несколько целей с именем 'gtest'. – Soeren

ответ

1

Это просто двойной включая 3d-участник проекта (gtest в вашем случае) с использованием add_subdirectory. К первым относятся точка

add_subdirectory(gmock-1.7.0)  

внутри YAML-CPP подпроект и второй включают пункт

add_subdirectory(thirdparty/googletest) 

в вашем CMakeLists.txt.

Такие двойные включения не работают в CMake, поэтому вам необходимо устранить один из вызовов add_subdirectory.

  1. В коде, вы можете заменить add_subdirectory подхода комбинации ExternalProject_Add и execute_process. Этот подход будет строить googletest на этапе конфигурации (так, find_package(GTest) будет работать), но не загрязняет пространство имен вашего проекта целями из googletest.

  2. В другом проекте (yaml-cpp) вы можете исключить включение googletest путем отключения тестирования.Просто отключить соответствующую опцию

    option(YAML_CPP_BUILD_TOOLS "Enable testing and parse tools" OFF) 
    

    перед тем

    add_subdirectory(thirdparty/yaml-cpp-yaml-cpp-0.5.3) 
    

    (Для отключения опции из CMakeLists.txt необходимо изменить весь проект чисто, то есть с пустым кэшем CMake).

    Обратите внимание, что этот параметр также отключает некоторые утилиты под подкатегорией util/ проекта yaml-cpp.

  3. Аналогичен первый подход, вы можете изменить включение yaml-cpp подпроекта к ExternalProject_Add + execute_process. Таким образом, все цели и задачи его подпроектов не будут загрязнять пространство имен вашего проекта.

+0

Можете привести пример для случая 1? Благодаря! – Tanasis

+0

Хм, не помню, почему в этом случае необходим ExternalProject. Конфигурировать gtest: 'execute_process (COMMAND $ {CMAKE_EXECUTABLE} -DCMAKE_INSTALL_PREFIX = WORKING_DIRECTORY )'. Создайте и установите gtest: 'execute_process (COMMAND $ {CMAKE_EXECUTABLE} --build --target install)'. – Tsyvarev

 Смежные вопросы

  • Нет связанных вопросов^_^