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