【问题标题】:How to build and link google benchmark using cmake in windows如何在 Windows 中使用 cmake 构建和链接谷歌基准测试
【发布时间】:2019-08-17 22:56:14
【问题描述】:

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

我认为的问题是 google-benchmark 在 src 文件夹中构建库,即它是在 src/Release/benchmark.lib 中构建的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

【问题讨论】:

  • 我们必须安装基准才能正常工作?
  • 是的。安装会将一些文件添加到公共目录。所以GoogleBenchmark包文件可以被cmake找到。
  • 但是不安装就不能使用吗?
  • 我猜,谷歌中没有人使用 windows[无法]

标签: cmake benchmarking microbenchmark google-benchmark


【解决方案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)

需要3.14以上的cmake版本

$ cmake .

$ cmake --build .

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

【讨论】:

    【解决方案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】:

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

      【讨论】:

        【解决方案4】:

        以下内容适用于 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)
        

        【讨论】:

          【解决方案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      ""
                  )
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-30
            • 1970-01-01
            • 2018-02-01
            • 1970-01-01
            • 2022-11-08
            • 2020-02-23
            • 1970-01-01
            相关资源
            最近更新 更多