#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