【问题标题】:CMake UnitTest on x86 in ARM projectARM项目中x86上的CMake UnitTest
【发布时间】:2020-11-30 03:29:15
【问题描述】:

我运行一个 Cortex-M 项目 (ARM)。在这里,我想使用 CMake 功能 add_test,然后我可以继续调用 make test

这很好用。

我遇到的问题是我添加的单元测试应该在我的 PC (x86) 上而不是在 ARM 上运行,因此测试失败。

我的子项目是:

project(dummy_math_lib_2)

add_library(${PROJECT_NAME}
        src/dummy_math_lib_2.cpp )
        
add_test(${PROJECT_NAME}
    src/dummy_math_lib_2.cpp
    unittest/src/unittest.cpp
)

target_include_directories(${PROJECT_NAME} PUBLIC inc)

target_link_libraries(${PROJECT_NAME})

在主 CMakeLists.txt 文件中,我启用“ENABLE_TESTING()”,然后执行以下操作:

cmake ..
make test

子项目树如下:

.
├── CMakeLists.txt
├── inc
│   └── dummy_math_lib_2.hpp
├── src
│   └── dummy_math_lib_2.cpp
└── unittest
    ├── inc
    └── src
        └── unittest.cpp

编辑:

project(dummy_math_lib_2)

add_library(${PROJECT_NAME}
        src/dummy_math_lib_2.cpp )
        
target_include_directories(${PROJECT_NAME} PUBLIC inc)

add_executable(UnitTest1 
    unittest/src/test.cpp
)

add_test(Test1 UnitTest1)

输出:

-- Configuring done
-- Generating done
-- Build files have been written to: /home/linux/workspace/cmake_t000D_cmake_DK/BUILD
Running tests...
Test project /home/linux/workspace/cmake_t000D_cmake_DK/BUILD
    Start 1: Test1
Could not find executable UnitTest1
Looked in the following places:
UnitTest1
UnitTest1
Release/UnitTest1
Release/UnitTest1
Debug/UnitTest1
Debug/UnitTest1
MinSizeRel/UnitTest1
MinSizeRel/UnitTest1
RelWithDebInfo/UnitTest1
RelWithDebInfo/UnitTest1
Deployment/UnitTest1
Deployment/UnitTest1
Development/UnitTest1
Development/UnitTest1
Unable to find executable: UnitTest1
1/1 Test #1: Test1 ............................***Not Run   0.00 sec

0% tests passed, 1 tests failed out of 1

Total Test time (real) =   0.00 sec

The following tests FAILED:
      1 - Test1 (Not Run)
Errors while running CTest
make: *** [Makefile:104: test] Error 8

EDIT2

好的,我找到了问题。解决方法如下:

cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug ..
make # <--- FIRST BUILD IT!
make test <--- THEN RUN THE TEST

这在理论上 ;-) 现在我必须弄清楚如何为 x86 而不是 ARM 构建它。但到目前为止还好,谢谢大家帮助我。

【问题讨论】:

  • 所以?你有问题要问吗?那么你想怎么解决这个问题呢?
  • 尝试在您的工具链文件 (cmake.org/cmake/help/latest/variable/…) 中使用 CMAKE_CROSSCOMPILING_EMULATOR 变量。我自己没有使用过,所以希望文档为您提供足够的信息。

标签: unit-testing cmake x86-64 cortex-m ctest


【解决方案1】:

add_test() 命令通常不应包含源文件。它应该使用任何必要的命令行参数简单地调用可执行文件。

你首先需要使用add_executable()来指定实际的单元测试可执行文件,你可以在add_test中引用这个目标:

add_library(${PROJECT_NAME}
    src/dummy_math_lib_2.cpp
)
        
target_include_directories(${PROJECT_NAME} PUBLIC inc)

# Define the test executable, UnitTest1.
add_executable(UnitTest1 
    unittest/src/unittest.cpp
)

# You may want to link the library under test to your test executable.
target_link_libraries(UnitTest1 PRIVATE ${PROJECT_NAME})

# Add the CTest unit test.
add_test(Test1 UnitTest1)

# Don't need this. As written, it does nothing.
target_link_libraries(${PROJECT_NAME})

我强烈建议您通读add_test 文档,以了解更多详细信息和此命令提供的不同选项。

【讨论】:

  • 谢谢。有了你的建议,我得到了一个错误。似乎缺少一些东西,它说:“开始 1:Test1,找不到可执行的 UnitTest1”
  • @aphardt 这表明您的可执行文件UnitTest1 没有成功构建,或者您将其命名为其他名称。确保在add_executable() 中创建的可执行目标名称匹配您在add_test 的第二个参数中引用的名称。
  • 我用当前结果编辑了帖子。我想我命名正确。是否需要执行某种命令来“链接”测试以获得二进制结果?
  • @aphardt 为了运行单元测试,您首先必须构建单元测试可执行文件,并确保它存在于您的系统中。它看起来不像是你做的,但你可以使用类似 make UnitTest1 的东西来构建它。
猜你喜欢
  • 2013-10-18
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2020-10-16
相关资源
最近更新 更多