Как построить и связать Google бенчмарк, используя cmake в Windows

Я пытаюсь создать Google-тест и использовать его с моей библиотекой с помощью cmake. Мне удалось построить google-benchmark и успешно запустить все его тесты с помощью cmake. К сожалению, я не могу правильно связать его с моим кодом C++ в Windows, используя cmake или cl.

проблема, я думаю, в том, что google-benchmark собирает библиотеку внутри папки src, то есть она встроена в src/Release/benchmark.lib. Теперь я не могу указать на нее в cmake, если я использую ${benchmark_LIBRARIES}, она ищет библиотеку в папка Release вне src, так как это обычное место, где собираются все библиотеки. и трудно найти примеры, которые работают в Windows.

вот два способа, которые я попробовал, оба могут собрать библиотеку и запустить все тесты, но я не могу указать на библиотеку правильно target_link_library

include(ExternalProject)
ExternalProject_Add(googlebenchmark
  GIT_REPOSITORY    https://github.com/google/benchmark.git
  GIT_TAG           master
  SOURCE_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-src"
  BINARY_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-build"
  CONFIGURE_COMMAND ${CMAKE_COMMAND} -B ${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-build -S ${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-src -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON
  BUILD_COMMAND     ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-build --config Release 
  INSTALL_COMMAND   ""
  TEST_COMMAND      ${CMAKE_CTEST_COMMAND} ${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-src ${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-build --build-config Release 
)

а также

ExternalProject_Add(googlebenchmark
  GIT_REPOSITORY    https://github.com/google/benchmark.git
  GIT_TAG           master 
  PREFIX            googlebenchmark
  CMAKE_ARGS        -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON
  BUILD_COMMAND     ${CMAKE_COMMAND} --build . --config Release
  INSTALL_COMMAND   ""
  TEST_COMMAND      ${CMAKE_CTEST_COMMAND} --build-config Release
)

как мне связать его с моим файлом C++ try.cpp после этого

5 ответов

CMakeLists.txt, как показано ниже

cmake_minimum_required(VERSION 3.14)
project(g_benchmark)
enable_testing()

include(FetchContent)

## Project-wide setup
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED YES)
set(CMAKE_CXX_EXTENSIONS NO)

# Externally provided libraries
FetchContent_Declare(googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG v1.10.x)

FetchContent_Declare(googlebenchmark
        GIT_REPOSITORY https://github.com/google/benchmark.git
        GIT_TAG master) # need master for benchmark::benchmark

FetchContent_MakeAvailable(
        googletest
        googlebenchmark)

add_executable(g_benchmark main.cpp)
target_link_libraries(g_benchmark benchmark::benchmark)

Требуется версия cmake выше 3.14

$ cmake.

$ cmake --build.

Ссылка: https://github.com/hohaidang/CPP_Basic2Advance/tree/master/Learning/CMake/g_benchmark

Я сам пришел сюда в поисках решения для копирования и вставки, но я не вижу четкого решения, хотя вижу, что на эту страницу смотрит много людей, поэтому вот что я сделал.

Я не использовал ExternalProject_Add но я был бы рад помочь вам, если бы вы указали мне на полный пример работающего теста, который я мог бы проверить.

Это то, что я использовал в своем проекте

include(FetchContent)
FetchContent_Declare(googlebenchmark
                     GIT_REPOSITORY https://github.com/google/benchmark
        )
FetchContent_MakeAvailable(googlebenchmark)

target_link_libraries(bench benchmark::benchmark)

Я еще не пробовал его на Windows, но сделаю это в следующий раз, когда загрузусь дома в win. Я пробовал это на нескольких машинах Linux.

Я надеюсь, что это помогает.

Следующее работает с VC++ 2022, также в режиме C++20.

      cmake_minimum_required(VERSION 3.20)

project(myproject C CXX)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type")

set(CMAKE_CXX_STANDARD 20)  # choose 14, 17, 20
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS NO)

include(FetchContent)
if (MSVC)
  set(gtest_force_shared_crt on)     # needed to avoid error LNK2038
endif()
set(BENCHMARK_ENABLE_TESTING off)    # to suppress benchmark internal tests
FetchContent_Declare(googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG release-1.11.0)      # or "main" for latest
FetchContent_Declare(googlebenchmark
        GIT_REPOSITORY https://github.com/google/benchmark.git
        GIT_TAG v1.6.0)              # or "master" for latest
FetchContent_MakeAvailable(googletest googlebenchmark)

enable_testing()

add_executable(mybench mybench.cpp)
target_link_libraries(mybench PRIVATE benchmark::benchmark)

После охоты за рабочим решением для Visual Studio 2019 я в конце концов заставил его работать. Я создал пример, чтобы помочь другим.

Вы можете просто сделать это:

      cmake_minimum_required(VERSION 3.16)

project(googletest-download NONE)

include(ExternalProject)

ExternalProject_Add(googletest
        GIT_REPOSITORY    https://github.com/google/googletest.git
        GIT_TAG           master
        SOURCE_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
        BINARY_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
        CONFIGURE_COMMAND ""
        BUILD_COMMAND     ""
        INSTALL_COMMAND   ""
        TEST_COMMAND      ""
        )

перезагрузите проект cmake и запустите сборку, если вы используете Clion

Другие вопросы по тегам