c++ 使用CMake构建32位和64位的谷歌测试

bq8i3lrv  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(228)

我正在为一个同时拥有64位和32位内核的平台编写软件,我想使用googletest为这两套软件编写单元测试。我想构建测试,以便64位软件的测试也是在64位构建的,类似地,32位测试应该在32位构建。这意味着googletest必须为两个目标分别构建64位和32位。我已经能够编写CMakeLists来实现这一点,但当我在父目录中创建一个包含所有子目录的主CMakeLists.txt文件时,构建失败,因为googletest只构建一次,并且由于体系结构不兼容,链接失败。
我正在使用vscode,我希望能够同时编译两个架构的所有测试,而不必手动更改vscode cmake扩展中的cmake.sourceDirectory,并单独编译每个目标。我知道我可以只手动编译单独的32位和64位库,我将它们添加到我的项目结构中,并配置CMake以链接到这些库,但我不想添加这些库(和gtest头文件)到我的git-repository中。我更喜欢使用CMake FetchContent特性来获取和编译它们。基本上我想进行两次编译,并分别编译每个目标,而不是像现在这样先编译所有目标,然后链接它们。这可能吗?
我几乎是一个菜鸟与CMake,所以我觉得我只是错过了一些明显的,有一些简单的方法来做我想要的。
下面是一个简单的示例项目,我一直在尝试使用它。我的实际项目具有类似的结构,但有多个64位目标和一个32位目标:

├─ CMakeLists.txt
├─ test32/
   ├─ CMakeLists.txt
   ├─ src/
      ├─ calc32.c
      ├─ calc32.h
   ├─ tests/
      ├─ tests32.cpp
      ├─ unit_tests_main.cpp
└─ test64/
   ├─ CMakeLists.txt
   ├─ src/
      ├─ calc64.c
      ├─ calc64.h
   ├─ tests/
      ├─ tests64.cpp
      ├─ unit_tests_main.cpp

src文件夹包含了我正在编写测试的应用软件,tests文件夹包含了测试。calc 32和64文件只包含了一个函数,它将两个整数参数相加并返回结果。tests 32和64文件都有一个简单的测试,测试函数是否确实返回了相加的结果。Unit_tests_main.cpp-文件具有gtest main函数。
根目录CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)

project(tests)

add_subdirectory("test32")
add_subdirectory("test64")

测试32个CMakeLists.txt文件:

project(test32)

cmake_minimum_required(VERSION 3.14)

set(EXEC_NAME "calc32")
set(TEST_EXEC_NAME "calc32_tests")
set(TEST_DIR "./tests")
set(SRC_DIR "./src")

include(GoogleTest)
include(FetchContent)

enable_testing()

FetchContent_Declare(
    googletest
    GIT_REPOSITORY https://github.com/google/googletest.git 
    GIT_TAG v1.13.0
)

FetchContent_MakeAvailable(googletest)

add_executable(${TEST_EXEC_NAME}
    ${TEST_DIR}/unit_tests_main.cpp
)

# Trigger 32 bit build for both gtest & application
set_target_properties(gtest PROPERTIES COMPILE_OPTIONS "-m32" LINK_FLAGS "-m32")
set_target_properties(${TEST_EXEC_NAME} PROPERTIES COMPILE_OPTIONS "-m32" LINK_FLAGS     "-m32")

# Add the files that contain your tests here
target_sources(${TEST_EXEC_NAME} PUBLIC
    ${TEST_DIR}/tests32.cpp
)

# Add the source files under test and their dependencies here
target_sources(${TEST_EXEC_NAME} PUBLIC
    ${SRC_DIR}/calc32.c
)

target_include_directories(${TEST_EXEC_NAME} PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR};
    ${SRC_DIR};
)

target_link_libraries(
    ${TEST_EXEC_NAME}
    gtest
)

gtest_discover_tests(${TEST_EXEC_NAME})

最后是test 64 CMakeLists.txt文件

project(test64)

cmake_minimum_required(VERSION 3.14)

set(EXEC_NAME "calc64")
set(TEST_EXEC_NAME "calc64_tests")
set(TEST_DIR "./tests")
set(SRC_DIR "./src")

include(GoogleTest)
include(FetchContent)

enable_testing()

FetchContent_Declare(
    googletest
    GIT_REPOSITORY https://github.com/google/googletest.git 
    GIT_TAG v1.13.0
)

FetchContent_MakeAvailable(googletest)

add_executable(${TEST_EXEC_NAME}
    ${TEST_DIR}/unit_tests_main.cpp
)

# Add the files that contain your tests here
target_sources(${TEST_EXEC_NAME} PUBLIC
    ${TEST_DIR}/tests64.cpp
)

# Add the source files under test and their dependencies here
target_sources(${TEST_EXEC_NAME} PUBLIC
    ${SRC_DIR}/calc64.c
)

target_include_directories(${TEST_EXEC_NAME} PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR};
    ${SRC_DIR};
)

target_link_libraries(
    ${TEST_EXEC_NAME}
    gtest
)

gtest_discover_tests(${TEST_EXEC_NAME})

正如您所看到的,除了32位CMakeLists.txt中的两个额外的set_target_properties-line之外,它们几乎完全相同

wlp8pajw

wlp8pajw1#

如果资源和内存不是测试目的的主要考虑因素,那么建议的解决方案实际上更适合使用单独的googletest32googletest64子目录和构建版本,特别是在避免不同测试环境之间不必要的相互依赖性方面。
对于每个环境,可以在CMake文件中定义option(),该文件允许通过if()endif()条件启用和禁用相应的测试。
如果需要考虑其他环境,那么这种解耦允许您独立地添加其他测试。

相关问题