8

我正在尝试构建 google-benchmark 并使用 cmake 将其与我的库一起使用。我已经成功地构建了 google-benchmark 并使用 cmake 成功运行了它的所有测试。不幸的是,我无法使用 cmake 或 cl 在 Windows 中将它与我的 c++ 代码正确链接。

我认为的问题是 google-benchmark 在 src 文件夹中构建库,即它是在 src/Release/benchmark.lib 中构建的,现在如果我使用 ${benchmark_LIBRARIES} 它会在src 外部的 Release 文件夹,因为这是构建所有库的通常位置。并且很难找到适用于 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

4

5 回答 5

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)

需要3.14以上的cmake版本

$ cmake 。

$ cmake --build 。

参考:https ://github.com/hohaidang/CPP_Basic2Advance/tree/master/Learning/CMake/g_benchmark

于 2020-11-16T06:18:48.623 回答
4

我自己来这里寻找复制粘贴解决方案,但我没有看到任何明确的解决方案,而我看到有很多人在看这个页面,所以这就是我所做的。

我没有使用过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机器上试过了。

我希望它有所帮助。

于 2020-02-26T15:45:16.080 回答
1

在为 Visual Studio 2019 寻找可行的解决方案后,我最终得到了它的工作。我创建了一个示例来帮助他人。

于 2020-07-23T20:01:13.940 回答
0

以下适用于 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)
于 2021-12-17T20:37:46.620 回答
-1

你可以简单地这样做:

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      ""
        )

如果您使用 Clion,请重新加载 cmake 项目并运行构建

于 2021-08-04T14:49:58.223 回答