CMake: добавление GTest для сборки - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь добавить googletest в свою сборку с помощью модуля FetchContent, но я нашел много частичных ответов и не смог найти то, что мне нужно. Кажется, существует множество датированных примеров, в которых используется модуль ExternalProject, но очень мало полезных примеров, в которых используется модуль FetchContent.

Вот неполный список ссылок, которые я просмотрел сегодня:

Вот структура файла, которую я хочу использовать:

-root
    -build
        -googletest-build
        -googletest-src
        -googletest-test
        -src
        -test
    -src
        -CMakeLists.txt
        -AllOfMySourceFiles
    -test
        -CMakeLists.txt
        -testgtest.cpp
    -CMakeLists.txt

Это команды, которые я пытаюсь использовать для сборки:

cmake ..
cmake --build .

Пока что я могу связать все мои исходные файлы в dll, которую я хочу, и я довольно уверен, что знаю, как связать его с тестовым файлом, который я хочуиспользовать. Основная проблема, с которой я столкнулся, - это использование модуля FetchContent, чтобы встроить testgtest.cpp в исполняемый файл и связать его с googletest. Он продолжает сбой при сборке, и конкретная причина его сбоя совершенно не очевидна.

root / CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_FLAGS_RELEASE "/MT")
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
set(CMAKE_CXX_STANDARD 11)

set(LIBNAME "WTP")
set(TESTNAME "TestRunner")

set(LIB_MAJOR_VERS "0")
set(LIB_MINOR_VERS "0")
set(LIB_PATCH_VERS "0")

#build source
project(${LIBNAME} 
    VERSION  ${LIB_MAJOR_VERS}.${LIB_MINOR_VERS}.${LIB_PATCH_VERS})
add_subdirectory(src)

#build tests
project(${TESTNAME})

add_subdirectory(test)
enable_testing()
add_test(${TESTNAME} ${TESTNAME})

src / CMakeLists.txt

# Build output setup
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/src/bin)

#get all of the source files
set(SRCS Export.c
    Regions/ReferenceConstants.h
    Regions/Region1.h
    Regions/Region2.h
    Regions/Region3.h
    Regions/Boundaries/RegionBoundaries/R2andR3.h
    Regions/Boundaries/SubregionBoundaries/Region3/Boundaries_vTP.h)

add_library(${LIBNAME} SHARED ${SRCS})

Этот работает так, как я намереваюсь до сих пор.

test / CMakeLists.txt

# Build output setup
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/bin)

################################
# GTest
################################
project(googletest-git NONE)

include(FetchContent)
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.8.0
)

set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
set(BUILD_GMOCK OFF CACHE BOOL "" FORCE)
set(BUILD_GTEST ON CACHE BOOL "" FORCE)

FetchContent_MakeAvailable(googletest)

################################
# Tests
################################
# Add test cpp file
add_executable(${TESTNAME} testgtest.cpp)
# Link test executable against gtest & gtest_main
target_link_libraries(${TESTNAME} gtest gtest_main)

Мне неясно, что я должен делать именно здесь для A) использования модуля FetchContent для добавления googletest в мою сборку AND B) связывания моего тестового исполняемого файла с googletest.

test / testgtest.cpp

#include "gtest/gtest.h"

TEST(sample_test_case, sample_test)
{
    EXPECT_EQ(1, 1);
}

Не совсем очевидно, что я должен быть #include конкретно в testgtest.cpp, но я видел это в примерах, которые я видел такЯ подумал, что это какая-то тупая, тайная магия, которая просто должна работать.

Вот вывод того, что я видел:

$ cmake --build .
Microsoft (R) Build Engine version 16.2.32702+c4012a063 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

  gtest-all.cc
D:\root\build\_deps\googletest-src\googletest\include\gtest/internal/gtest-port.h(996,34): error C2220:  warning treated as error - no 'object' file generated [D:\root\build\_deps\googletest-build\googletest\gtest.vcxproj]
D:\root\build\_deps\googletest-src\googletest\include\gtest/internal/gtest-port.h(996,34): warning C4996:  'std::tr1': warning STL4002: The non-Standard std::tr1 namespace and TR1-only machinery are deprecated and will be REMOVED. You can define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING to acknowledge that you have received this warning. [D:\root\build\_deps\googletest-build\googletest\gtest.vcxproj]

The warning C4996 будет продолжать повторять тошноту до тех пор, пока она не закончится.

Я хочу получить googletest из git, так что мне нужно сделать по-другому? здесь, чтобы успешно создать и использовать googletest с моими тестами?

Спасибо за чтение

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Это то, что решило эту проблему для меня.

Спасибо Chipster за дополнительные исследования этой проблемы и в конечном итоге подтолкнул меня в правильном направлении.

Поскольку проблема, похоже, связана с выпуском 1.8.0, содержащим некоторые ошибки, которые не были объединены с каким-либо другим выпуском, я решил, что должен быть более поздний выпуск googletest, на который я мог бы сослаться в моем файле CMake. что бы решить эту проблему.

Вот и вот, только изменение этого в release-1.10.0 (самое позднее на момент написания этой статьи) из release-1.8.0 решило эту конкретную проблему для меня:

test / CMakeLists.txt

FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.10.0
)

Для тех, кто интересуется, удастся ли удалить следующие строки для этого решения и сценария, чтобы вы могли создать googlemock & googletest:

test / CMakeLists.txt

set(BUILD_GMOCK OFF CACHE BOOL "" FORCE)
set(BUILD_GTEST ON CACHE BOOL "" FORCE)

Я также проверил это и смог построить тестовый прогон без этих строк.

1 голос
/ 03 ноября 2019

Ваша проблема, похоже, не в самом cmake, а в том, что вы, похоже, сталкиваетесь с предупреждением , которое рассматривается как ошибка (инструкции для Visual Studio. Может отличаться на другой платформе). Вы можете отключить эту настройку , но, очевидно, это не всегда возможно, и может даже не быть хорошим решением для вашей ситуации.

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

В любом случае, еще один возможный обходной путь - определение макроса , как сказано в предупреждении:

#define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING  1

Но, опять же, это просто обходной путь. Это все еще в конечном счете должно быть исправлено, но это, очевидно, зависит от них, чтобы это исправить.

...