2017-02-07 15 views
4

これは私の最初の投稿StackOverflowであり、私の質問に何か問題がある場合は謝罪します。CMakeと複数のgtestとの競合

私はCMakeで新しく、ライブラリ内で使用されているgtestディレクトリがあるC++プロジェクトでgtest(Google Test)をインポートしようとすると問題に遭遇しています。

マイルートCMakeLists.txtファイルが(私の変更は、「変更を開始」と「変更を終了」の間で行われる)これです:cmake ..(より適切なエラーメッセージ - おそらく)を実行しているときにCMakeから

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 

と出力次のとおりです。

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

現在
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のコピーを持っています

既存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

なぜ2つのgoogleTestフォルダ(_My googletestディレクトリ_と_既存のgoogletest_ディレクトリ)がありますか? yaml-cpp-yaml-cpp-0.5.3のCMakeListにadd_subdirectory(gmock-1.7.0)というエントリもありますか?これは問題である可能性があります。エラーメッセージには、 'gtest'という名前の複数のターゲットがあると言われています。 – Soeren

答えて

1

これはちょうどダブルadd_subdirectoryを使用して 3D-パーティプロジェクト(あなたのケースでgtest)を含むです。最初のポイントは

add_subdirectory(gmock-1.7.0)  

YAML-CPP内サブプロジェクト及び第2の点が含まれているなどがあなたのCMakeLists.txt

add_subdirectory(thirdparty/googletest) 

です。

このようなダブルは、CMakeでは動作しませんので、add_subdirectoryのいずれかを削除する必要があります。あなたのコードで

  1. 、あなたはExternalProject_Addexecute_processの組み合わせによってadd_subdirectoryアプローチを置き換えることができます。その方法では設定段階でgoogletestが構築されます(find_package(GTest)は動作しますが)、googletestのターゲットを使ってプロジェクトの名前空間を汚染しません。

  2. 他のプロジェクトyaml-cpp)では、テストを無効にしてgoogletestを削除することができます。ただ、

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

    前に、適切なオプション

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

    を無効(CMakeLists.txtからオプションを無効にするために、あなたはプロジェクト全体きれい、それが空CMakeのキャッシュであるを再設定する必要があります)。

    このオプションは、yaml-cppプロジェクトのサブディレクトリutil/の下にあるユーティリティも無効にすることに注意してください。

  3. yaml-cppサブプロジェクトの内容をExternalProject_Add + execute_processに変更することができます。そのような方法で、そのサブプロジェクトのすべてのターゲットとターゲットは、プロジェクトの名前空間を汚染しません。

+0

ケース1の例を挙げることができますか?ありがとう! – Tanasis

+0

Hm、そのような場合にExternalProjectが必要な理由を覚えていない。 gtestを設定する: 'execute_process(COMMAND $ {CMAKE_EXECUTABLE} -DCMAKE_INSTALL_PREFIX = <選択したgtest-install-dir> WORKING_DIRECTORY <選択されたgtestビルドディレクトリ>)' gtest: 'execute_process(COMMAND $ {CMAKE_EXECUTABLE} - ビルド<選択 - gtest-build-dir> --target install)'をビルドしてインストールします。 – Tsyvarev