发布
社区首页 >问答首页 >如何将FetchContent与GTest结合使用

如何将FetchContent与GTest结合使用
EN

Stack Overflow用户
提问于 2022-09-06 15:49:11
回答 3查看 281关注 0票数 0

我试着理解以前的帮助:

所以我用gtest写了一个非常简单的项目用例。

目前我有:

代码语言:javascript
代码运行次数:0
复制
% cat CMakeLists.txt
cmake_minimum_required(VERSION 3.24)
project(p)

include(FetchContent)
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        58d77fa8070e8cec2dc1ed015d66b454c8d78850 # release-1.12.1
  OVERRIDE_FIND_PACKAGE
)
FetchContent_MakeAvailable(googletest)

if(TARGET GTest::gtest_main)
  message("Target was found")
endif()

find_package(GTest 1.12.1 REQUIRED)

# Now make sure hwy uses our gtest 1.12.1:
set(HWY_SYSTEM_GTEST ON CACHE BOOL "")
FetchContent_Declare(
  hwy
  GIT_REPOSITORY https://github.com/google/highway.git
  GIT_TAG        22e3d7276f4157d4a47586ba9fd91dd6303f441a # 1.0.1
)
FetchContent_MakeAvailable(hwy)

如果我运行它,我得到的是:

代码语言:javascript
代码运行次数:0
复制
$ cmake ..
[...]
Target was found
-- Found GTest: /usr/lib/x86_64-linux-gnu/libgtest.a (Required is at least version "1.12.1")
[...]
-- Found GTest: /usr/lib/x86_64-linux-gnu/cmake/GTest/GTestConfig.cmake (found version "1.10.0")

这个输出对我来说是完全没有意义的。我想在构建hwy1.0.1的过程中重新注入googletest 1.12.1的构建树。我的问题如下:在上面的例子中,我应该怎么做?

关于包()的原始上游文档非常不清楚。

问题的重要部分是以下两行:

代码语言:javascript
代码运行次数:0
复制
# Now make sure hwy uses our gtest 1.12.1:
set(HWY_SYSTEM_GTEST ON CACHE BOOL "")

把gtest再注入到hwy中的机制。我的问题不是直接通过获取内容直接使用gtest。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-07 11:47:24

下面是对我有用的东西(使用cmake 3.24.1)

代码语言:javascript
代码运行次数:0
复制
cmake_minimum_required(VERSION 3.24)
project(p)

include(FetchContent)
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG 58d77fa8070e8cec2dc1ed015d66b454c8d78850 # release-1.12.1
  OVERRIDE_FIND_PACKAGE)
FetchContent_MakeAvailable(googletest)

if(NOT EXISTS ${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/gtest-config.cmake
   AND NOT EXISTS ${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/GTestConfig.cmake)
  file(
    WRITE ${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/gtest-config.cmake
    [=[
include(CMakeFindDependencyMacro)
find_dependency(googletest)
if(NOT TARGET GTest::GTest)
  add_library(GTest::GTest INTERFACE IMPORTED)
  target_link_libraries(GTest::GTest INTERFACE GTest::gtest)
endif()
if(NOT TARGET GTest::Main)
  add_library(GTest::Main INTERFACE IMPORTED)
  target_link_libraries(GTest::Main INTERFACE GTest::gtest_main)
endif()
]=])
endif()

if(NOT EXISTS ${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/gtest-config-version.cmake
   AND NOT EXISTS ${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/GTestConfigVersion.cmake)
  file(
    WRITE ${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/gtest-config-version.cmake
    [=[
include(${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/googletest-config-version.cmake OPTIONAL)
if(NOT PACKAGE_VERSION_COMPATIBLE)
  include(${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/googletestConfigVersion.cmake OPTIONAL)
endif()
]=])
endif()

FetchContent_Declare(
  hwy
  GIT_REPOSITORY https://github.com/google/highway.git
  GIT_TAG 22e3d7276f4157d4a47586ba9fd91dd6303f441a # 1.0.1
)
# Now make sure hwy uses our gtest 1.12.1:
set(HWY_SYSTEM_GTEST
    ON
    CACHE BOOL "")
FetchContent_MakeAvailable(hwy)

仅供参考,自提交以来,hwy现在支持新的风格gtest:

票数 0
EN

Stack Overflow用户

发布于 2022-09-06 17:57:03

官方的文档说:

FetchContent_Declare( .)调用包括此选项,随后调用find_package( .)将确保FetchContent_MakeAvailable()已被调用

您正在为FetchContent_Declarefind_package使用不同的名称。使用find_package(googletest 1.12.1 REQUIRED)就可以了。

不幸的是,googletest附带的cmake脚本中有一个"bug“,所以您不能将GTestFetchContent_Declare一起使用。它对子项目使用GTest_FOUNDGMock_FOUND,因此不能对父项目使用GTest (名称冲突)。

票数 0
EN

Stack Overflow用户

发布于 2022-09-09 14:13:05

以下代码适用于我:

CMakeLists.txt

代码语言:javascript
代码运行次数:0
复制
cmake_minimum_required(VERSION 3.20)
project(case23)

include(FetchContent)
FetchContent_Declare(googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG release-1.12.1
)
FetchContent_MakeAvailable(googletest)

add_executable(main main.cpp)
target_link_libraries(main gtest_main)

main.cpp

代码语言:javascript
代码运行次数:0
复制
#include <gtest/gtest.h>

int myadd(int a, int b) {
    return a + b;
}

TEST(testCase, test1) {
    EXPECT_EQ(myadd(2, 3), 5);
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73624739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档