我正在为一个同时拥有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之外,它们几乎完全相同
1条答案
按热度按时间wlp8pajw1#
如果资源和内存不是测试目的的主要考虑因素,那么建议的解决方案实际上更适合使用单独的
googletest32
和googletest64
子目录和构建版本,特别是在避免不同测试环境之间不必要的相互依赖性方面。对于每个环境,可以在
CMake
文件中定义option()
,该文件允许通过if()
和endif()
条件启用和禁用相应的测试。如果需要考虑其他环境,那么这种解耦允许您独立地添加其他测试。