Как создать и связать Google benchmark с помощью cmake в Windows

#cmake #benchmarking #microbenchmark #google-benchmark

#cmake #сравнительный анализ #микробенчмарк #google-benchmark

Вопрос:

Я пытаюсь создать google-benchmark и использовать его со своей библиотекой с помощью 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 после этого

Комментарии:

1. взгляните на этот пример: github.com/RichardDally/MicroBenchmark

2. мы должны установить benchmark, чтобы это работало правильно?

3. ДА. При установке некоторые файлы будут добавлены в общие каталоги. Таким образом, GoogleBenchmark файлы пакетов могут быть найдены cmake.

4. но можем ли мы не использовать его без install?

5. я думаю, никто в Google не использует Windows [cant]

Ответ №1:

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 —сборка .

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

Комментарии:

1. В настоящее время я не могу внести правку, но мне пришлось изменить GIT_TAG для обоих репозиториев на main такой, чтобы пример соответствовал философии «жить головой», к которой применимы оба репозитория.

Ответ №2:

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

Я не использовал 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.

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

Ответ №3:

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

 cmake_minimum_required(VERSION 3.20)

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

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

include(FetchContent)
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)

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

Если вы получаете ошибки в ссылках LNK2038, добавьте также это:

 if (MSVC)
  set(gtest_force_shared_crt on)     # needed to avoid error LNK2038
endif()
  

Ответ №4:

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

Ответ №5:

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

 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